Skip to content

Commit

Permalink
Merge branch 'puppetlabs:main' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
davidphay authored Aug 16, 2023
2 parents 2fb30b5 + 4ddb460 commit 4ffae1f
Show file tree
Hide file tree
Showing 18 changed files with 423 additions and 151 deletions.
3 changes: 2 additions & 1 deletion acceptance/config/beaker/options.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@
"puppetserver-confdir"=>"/etc/puppetlabs/puppetserver/conf.d",
"puppetserver-config"=>
"/etc/puppetlabs/puppetserver/conf.d/puppetserver.conf",
:puppet_build_version=>"cac0f53a340bd0490cd4edcee7d9a09bc9b51ceb"}
:puppet_build_version=>"75cd90a7dcbbf6120602a2071e5b8800b7c71087",
:ssh=>{:config=>true}}
6 changes: 3 additions & 3 deletions acceptance/suites/pre_suite/foss/70_install_puppet.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@
nss_package_name="nss"
end
if nss_package_name
if master['platform'] != 'el-8-x86_64'
master.upgrade_package(nss_package_name)
else
if master['platform'] == 'el-8-x86_64' || master['platform'] == 'el-9-x86_64'
master.install_package(nss_package_name)
else
master.upgrade_package(nss_package_name)
end
else
logger.warn("Don't know what nss package to use for #{variant} so not installing one")
Expand Down
2 changes: 1 addition & 1 deletion dev/puppetserver.conf
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ certificate-authority: {
# Disable auto renewal of certs by default.
allow-auto-renewal: false
# This value determines the lifetime of the cert if auto-renewal is enabled
auto-renewal-cert-ttl: "60d"
auto-renewal-cert-ttl: "90d"
# Default cert expiration time. If the value is set here, it will take precedence over ca-ttl setting in puppet.conf
#ca-ttl: "60d"
}
12 changes: 12 additions & 0 deletions ezbake/config/conf.d/auth.conf
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,18 @@ authorization: {
sort-order: 500
name: "puppetlabs csr"
},
{
# Allow nodes to renew their certificate
match-request: {
path: "/puppet-ca/v1/certificate_renewal"
type: path
method: post
}
# this endpoint should never be unauthenticated, as it requires the cert to be provided.
allow: "*"
sort-order: 500
name: "puppetlabs certificate renewal"
},
{
# Allow the CA CLI to access the certificate_status endpoint
match-request: {
Expand Down
38 changes: 21 additions & 17 deletions locales/puppetserver.pot
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
msgid ""
msgstr ""
"Project-Id-Version: puppetlabs.puppetserver \n"
"X-Git-Ref: 4dc7b77e0db804b7a046682903df2660ec1b9304\n"
"X-Git-Ref: b74338698b919c1bb53ba0718fb232ea7391b0d3\n"
"Report-Msgid-Bugs-To: docs@puppet.com\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
Expand Down Expand Up @@ -238,6 +238,26 @@ msgid_plural "Entity {1} {2} {0} certificates: {3}."
msgstr[0] ""
msgstr[1] ""

#: src/clj/puppetlabs/puppetserver/certificate_authority.clj
msgid "Found auto-renew-attribute {0}"
msgstr ""

#: src/clj/puppetlabs/puppetserver/certificate_authority.clj
msgid "Deleted certificate request for {0} at {1}"
msgstr ""

#: src/clj/puppetlabs/puppetserver/certificate_authority.clj
msgid "Path {0} exists but could not be deleted"
msgstr ""

#: src/clj/puppetlabs/puppetserver/certificate_authority.clj
msgid "No certificate request for {0} at expected path {1}"
msgstr ""

#: src/clj/puppetlabs/puppetserver/certificate_authority.clj
msgid "Calculating validity dates for {0} from ttl of {1} "
msgstr ""

#: src/clj/puppetlabs/puppetserver/certificate_authority.clj
msgid "Saving CSR to ''{0}''"
msgstr ""
Expand Down Expand Up @@ -280,18 +300,6 @@ msgid ""
"your ca.conf file."
msgstr ""

#: src/clj/puppetlabs/puppetserver/certificate_authority.clj
msgid "Deleted certificate request for {0}"
msgstr ""

#: src/clj/puppetlabs/puppetserver/certificate_authority.clj
msgid "Path {0} exists but could not be deleted"
msgstr ""

#: src/clj/puppetlabs/puppetserver/certificate_authority.clj
msgid "No certificate request for {0} at expected path {1}"
msgstr ""

#: src/clj/puppetlabs/puppetserver/certificate_authority.clj
msgid "Cannot support delta CRL."
msgstr ""
Expand Down Expand Up @@ -340,10 +348,6 @@ msgstr ""
msgid "CA already initialized for SSL"
msgstr ""

#: src/clj/puppetlabs/puppetserver/certificate_authority.clj
msgid "Removed certificate request for {0} at ''{1}''"
msgstr ""

#: src/clj/puppetlabs/puppetserver/certificate_authority.clj
msgid "Certificate with serial {0} is already revoked."
msgstr ""
Expand Down
8 changes: 4 additions & 4 deletions project.clj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
(def ps-version "8.0.1-SNAPSHOT")
(def ps-version "8.2.1-SNAPSHOT")

(defn deploy-info
[url]
Expand Down Expand Up @@ -27,13 +27,12 @@

:min-lein-version "2.9.1"

:parent-project {:coords [puppetlabs/clj-parent "6.0.0"]
:parent-project {:coords [puppetlabs/clj-parent "7.1.0"]
:inherit [:managed-dependencies]}

:dependencies [[org.clojure/clojure]

[slingshot]
[clj-commons/clj-yaml]
[org.yaml/snakeyaml]
[commons-lang]
[commons-io]
Expand All @@ -45,6 +44,7 @@
[liberator]
[org.apache.commons/commons-exec]
[io.dropwizard.metrics/metrics-core]
[org.yaml/snakeyaml "2.0"]

;; We do not currently use this dependency directly, but
;; we have documentation that shows how users can use it to
Expand Down Expand Up @@ -172,7 +172,7 @@
[puppetlabs/jruby-utils]
[puppetlabs/puppetserver ~ps-version]
[puppetlabs/trapperkeeper-webserver-jetty9]]
:plugins [[puppetlabs/lein-ezbake "2.4.1"]]
:plugins [[puppetlabs/lein-ezbake "2.5.3"]]
:name "puppetserver"}
:uberjar {:dependencies [[org.bouncycastle/bcpkix-jdk18on]
[puppetlabs/trapperkeeper-webserver-jetty9]]
Expand Down
2 changes: 1 addition & 1 deletion ruby/facter
Submodule facter updated 42 files
+0 −2 .rubocop.yml
+6 −10 acceptance/lib/facter/acceptance/base_fact_utils.rb
+14 −4 acceptance/tests/facts/networking_facts_with_vlans.rb
+2 −2 acceptance/tests/facts/ruby.rb
+2 −0 acceptance/tests/options/config_file/ttls_cache_missing_facts.rb
+1 −1 acceptance/tests/options/help.rb
+0 −47 agent/facter-ng.gemspec
+0 −7 agent/lib/facter-ng.rb
+0 −9 bin/facter-ng
+1 −1 facter.gemspec
+3 −1 lib/facter/custom_facts/util/collection.rb
+1 −1 lib/facter/custom_facts/util/fact.rb
+4 −0 lib/facter/custom_facts/util/normalization.rb
+4 −0 lib/facter/facts/linux/partitions.rb
+0 −19 lib/facter/facts/windows/augeas/version.rb
+0 −1 lib/facter/framework/core/file_loader.rb
+4 −2 lib/facter/resolvers/aix/networking.rb
+3 −0 lib/facter/resolvers/augeas.rb
+1 −4 lib/facter/resolvers/base_resolver.rb
+1 −1 lib/facter/resolvers/dmi.rb
+11 −0 lib/facter/resolvers/os_release.rb
+32 −13 lib/facter/resolvers/solaris/mountpoints.rb
+1 −1 lib/facter/resolvers/windows/timezone.rb
+1 −1 lib/facter/util/resolvers/filesystem_helper.rb
+4 −2 lib/facter/util/resolvers/networking/networking.rb
+1 −1 lib/facter/version.rb
+1 −1 spec/custom_facts/core/execution/posix_spec.rb
+20 −0 spec/custom_facts/core/resolvable_spec.rb
+12 −1 spec/custom_facts/util/collection_spec.rb
+6 −0 spec/custom_facts/util/fact_spec.rb
+30 −0 spec/custom_facts/util/normalization_spec.rb
+0 −25 spec/facter/facts/windows/augeas/version_spec.rb
+12 −0 spec/facter/query_parser_spec.rb
+18 −0 spec/facter/resolvers/aix/networking_spec.rb
+1 −1 spec/facter/resolvers/augeas_spec.rb
+3 −3 spec/facter/resolvers/base_resolver_spec.rb
+26 −0 spec/facter/resolvers/os_release_spec.rb
+0 −7 spec/facter/version_spec.rb
+6 −0 spec/fixtures/netstat_rn_two
+8 −0 spec/fixtures/os_release_sles
+7 −0 spec/fixtures/os_release_sles_sap
+53 −0 spec_integration/facter_spec.rb
2 changes: 1 addition & 1 deletion ruby/puppet
Submodule puppet updated 84 files
+2 −2 .gemspec
+1 −1 acceptance/Gemfile
+11 −1 acceptance/tests/resource/group/should_query_all.rb
+1 −0 docs/index.md
+225 −0 docs/settings.md
+1 −1 ext/project_data.yaml
+37 −7 lib/puppet/defaults.rb
+12 −5 lib/puppet/http/client.rb
+32 −2 lib/puppet/http/service/ca.rb
+6 −4 lib/puppet/node/environment.rb
+20 −3 lib/puppet/pops/evaluator/deferred_resolver.rb
+2 −0 lib/puppet/ssl/oids.rb
+1 −1 lib/puppet/ssl/ssl_provider.rb
+143 −14 lib/puppet/ssl/state_machine.rb
+1 −4 lib/puppet/thread_local.rb
+1 −1 lib/puppet/version.rb
+29 −0 lib/puppet/x509/cert_provider.rb
+2,346 −2,310 locales/puppet.pot
+31 −3 man/man5/puppet.conf.5
+1 −1 man/man8/puppet-agent.8
+1 −1 man/man8/puppet-apply.8
+1 −1 man/man8/puppet-catalog.8
+1 −1 man/man8/puppet-config.8
+1 −1 man/man8/puppet-describe.8
+1 −1 man/man8/puppet-device.8
+1 −1 man/man8/puppet-doc.8
+1 −1 man/man8/puppet-epp.8
+1 −1 man/man8/puppet-facts.8
+1 −1 man/man8/puppet-filebucket.8
+1 −1 man/man8/puppet-generate.8
+1 −1 man/man8/puppet-help.8
+1 −1 man/man8/puppet-lookup.8
+1 −1 man/man8/puppet-module.8
+1 −1 man/man8/puppet-node.8
+1 −1 man/man8/puppet-parser.8
+1 −1 man/man8/puppet-plugin.8
+1 −1 man/man8/puppet-report.8
+1 −1 man/man8/puppet-resource.8
+1 −1 man/man8/puppet-script.8
+1 −1 man/man8/puppet-ssl.8
+2 −2 man/man8/puppet.8
+107 −107 spec/fixtures/ssl/127.0.0.1-key.pem
+52 −51 spec/fixtures/ssl/127.0.0.1.pem
+56 −56 spec/fixtures/ssl/bad-basic-constraints.pem
+53 −53 spec/fixtures/ssl/bad-int-basic-constraints.pem
+54 −54 spec/fixtures/ssl/ca.pem
+26 −26 spec/fixtures/ssl/crl.pem
+11 −11 spec/fixtures/ssl/ec-key.pem
+33 −32 spec/fixtures/ssl/ec.pem
+12 −12 spec/fixtures/ssl/encrypted-ec-key.pem
+108 −108 spec/fixtures/ssl/encrypted-key.pem
+26 −26 spec/fixtures/ssl/intermediate-agent-crl.pem
+56 −56 spec/fixtures/ssl/intermediate-agent.pem
+29 −29 spec/fixtures/ssl/intermediate-crl.pem
+53 −53 spec/fixtures/ssl/intermediate.pem
+107 −107 spec/fixtures/ssl/oid-key.pem
+51 −50 spec/fixtures/ssl/oid.pem
+107 −107 spec/fixtures/ssl/pluto-key.pem
+52 −51 spec/fixtures/ssl/pluto.pem
+67 −0 spec/fixtures/ssl/renewed.pem
+107 −107 spec/fixtures/ssl/request-key.pem
+50 −48 spec/fixtures/ssl/request.pem
+107 −107 spec/fixtures/ssl/revoked-key.pem
+51 −50 spec/fixtures/ssl/revoked.pem
+107 −107 spec/fixtures/ssl/signed-key.pem
+49 −48 spec/fixtures/ssl/signed.pem
+51 −50 spec/fixtures/ssl/tampered-cert.pem
+50 −48 spec/fixtures/ssl/tampered-csr.pem
+107 −107 spec/fixtures/ssl/unknown-127.0.0.1-key.pem
+50 −49 spec/fixtures/ssl/unknown-127.0.0.1.pem
+107 −107 spec/fixtures/ssl/unknown-ca-key.pem
+54 −54 spec/fixtures/ssl/unknown-ca.pem
+63 −13 spec/integration/application/agent_spec.rb
+14 −0 spec/integration/application/apply_spec.rb
+16 −0 spec/integration/http/client_spec.rb
+3 −10 spec/lib/puppet/test_ca.rb
+1 −0 spec/unit/application/lookup_spec.rb
+2 −40 spec/unit/defaults_spec.rb
+15 −0 spec/unit/file_system/path_pattern_spec.rb
+83 −0 spec/unit/http/service/ca_spec.rb
+20 −0 spec/unit/ssl/ssl_provider_spec.rb
+143 −3 spec/unit/ssl/state_machine_spec.rb
+49 −0 spec/unit/x509/cert_provider_spec.rb
+4 −0 tasks/generate_cert_fixtures.rake
96 changes: 59 additions & 37 deletions src/clj/puppetlabs/puppetserver/certificate_authority.clj
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
[puppetlabs.puppetserver.common :as common]
[puppetlabs.puppetserver.ringutils :as ringutils]
[puppetlabs.ssl-utils.core :as utils]
[clj-yaml.core :as yaml]
[puppetlabs.puppetserver.shell-utils :as shell-utils]
[puppetlabs.i18n.core :as i18n]))

Expand Down Expand Up @@ -242,10 +241,10 @@
60)

(def default-auto-ttl-renewal
"60d") ; 60 days by default
"90d") ; 90 days by default

(def default-auto-ttl-renewal-seconds
(duration-str->sec default-auto-ttl-renewal)) ; 60 days by default
(duration-str->sec default-auto-ttl-renewal)) ; 90 days by default

(schema/defn ^:always-validate initialize-ca-config
"Adds in default ca config keys/values, which may be overwritten if a value for
Expand Down Expand Up @@ -339,6 +338,10 @@
:pp_auth_role "1.3.6.1.4.1.34380.1.3.13"
:pp_cli_auth cli-auth-oid})

;; OID for the attribute that indicates if the agent supports auto-renewal or not
(def pp_auth_auto_renew-attribute
"1.3.6.1.4.1.34380.1.3.2",)

(def netscape-comment-value
"Standard value applied to the Netscape Comment extension for certificates"
"Puppet Server Internal Certificate")
Expand Down Expand Up @@ -497,6 +500,10 @@
(into (mapv (partial str "IP:") (utils/get-subject-ip-alt-names cert-or-csr))
(mapv (partial str "DNS:") (utils/get-subject-dns-alt-names cert-or-csr))))

(schema/defn get-csr-attributes :- utils/SSLMultiValueAttributeList
[csr :- PKCS10CertificationRequest]
(utils/get-attributes csr))

(schema/defn authorization-extensions :- {schema/Str schema/Str}
"Get the authorization extensions for the certificate or CSR.
These are extensions that fall under the ppAuthCert OID arc.
Expand Down Expand Up @@ -1001,7 +1008,7 @@
certificate extensions from the `extensions_requests` section."
[csr-attributes-file :- schema/Str]
(if (fs/file? csr-attributes-file)
(let [csr-attrs (yaml/parse-string (slurp csr-attributes-file))
(let [csr-attrs (common/parse-yaml (slurp csr-attributes-file))
ext-req (:extension_requests csr-attrs)]
(map (fn [[oid value]]
{:oid (or (get puppet-short-names oid)
Expand All @@ -1022,7 +1029,7 @@
csr-attr-exts (create-csr-attrs-exts csr-attributes)
base-ext-list [(utils/netscape-comment
netscape-comment-value)
(utils/authority-key-identifier ca-cert)
(utils/authority-key-identifier-options ca-cert)
(utils/basic-constraints-for-non-ca true)
(utils/ext-key-usages
[ssl-server-cert ssl-client-cert] true)
Expand Down Expand Up @@ -1386,7 +1393,7 @@
csr-ext-list (utils/get-extensions csr)
base-ext-list [(utils/netscape-comment
netscape-comment-value)
(utils/authority-key-identifier
(utils/authority-key-identifier-options
cacert)
(utils/basic-constraints-for-non-ca true)
(utils/ext-key-usages
Expand Down Expand Up @@ -1438,15 +1445,51 @@
(let [[msg signee certnames ip] (generate-cert-message-from-request request subjects activity-type)]
(report-cert-event report-activity msg signee certnames ip activity-type))))

(schema/defn supports-auto-renewal? :- schema/Bool
"Given a csr, determine if the requester is capable of supporting auto-renewal by looking for a specific attribute"
[csr]
(if-let [auto-renew-attribute (first (filter #(= pp_auth_auto_renew-attribute (:oid %)) (get-csr-attributes csr)))]
(do
(log/debug (i18n/trs "Found auto-renew-attribute {0}" (first (:values auto-renew-attribute))))
;; the values is a sequence of results, assume the first one is correct.
(= "true" (first (:values auto-renew-attribute))))
false))

(schema/defn ^:always-validate delete-certificate-request! :- OutcomeInfo
"Delete pending certificate requests for subject"
[{:keys [csrdir]} :- CaSettings
subject :- schema/Str]
(let [csr-path (path-to-cert-request csrdir subject)]

(if (fs/exists? csr-path)
(if (fs/delete csr-path)
(let [msg (i18n/trs "Deleted certificate request for {0} at {1}" subject csr-path)]
(log/debug msg)
{:outcome :success
:message msg})
(let [msg (i18n/trs "Path {0} exists but could not be deleted" csr-path)]
(log/error msg)
{:outcome :error
:message msg}))
(let [msg (i18n/trs "No certificate request for {0} at expected path {1}"
subject csr-path)]
(log/warn msg)
{:outcome :not-found
:message msg}))))

(schema/defn ^:always-validate
autosign-certificate-request!
"Given a subject name, their certificate request, and the CA settings
from Puppet, auto-sign the request and write the certificate to disk."
[subject :- schema/Str
csr :- CertificateRequest
{:keys [cacert cakey signeddir ca-ttl] :as ca-settings} :- CaSettings
{:keys [cacert cakey signeddir ca-ttl allow-auto-renewal auto-renewal-cert-ttl] :as ca-settings} :- CaSettings
report-activity]
(let [validity (cert-validity-dates ca-ttl)
(let [renewal-ttl (if (and allow-auto-renewal (supports-auto-renewal? csr))
auto-renewal-cert-ttl
ca-ttl)
_ (log/debug (i18n/trs "Calculating validity dates for {0} from ttl of {1} " subject renewal-ttl))
validity (cert-validity-dates renewal-ttl)
;; if part of a CA bundle, the intermediate CA will be first in the chain
cacert (utils/pem->ca-cert cacert cakey)
signed-cert (utils/sign-certificate (utils/get-subject-from-x509-certificate
Expand All @@ -1462,6 +1505,7 @@
cacert))]
(write-cert-to-inventory! signed-cert ca-settings)
(write-cert signed-cert (path-to-cert signeddir subject))
(delete-certificate-request! ca-settings subject)
(report-activity [subject] "signed")))

(schema/defn ^:always-validate
Expand All @@ -1475,7 +1519,7 @@
(write-csr csr csr-path)))

(schema/defn validate-duplicate-cert-policy!
"Throw a slingshot exception if allow-duplicate-certs is false
"Throw a slingshot exception if allow-duplicate-certs is false,
and we already have a certificate or CSR for the subject.
The exception map will look like:
{:kind :duplicate-cert
Expand Down Expand Up @@ -1552,6 +1596,7 @@
(i18n/tru "To allow subject alternative names, set allow-subject-alt-names to true in your ca.conf file.")
(i18n/tru "Then restart the puppetserver and try signing this certificate again."))})))))))


(schema/defn ^:always-validate process-csr-submission!
"Given a CSR for a subject (typically from the HTTP endpoint),
perform policy checks and sign or save the CSR (based on autosign).
Expand All @@ -1573,29 +1618,8 @@
(ensure-no-authorization-extensions! csr allow-authorization-extensions)
(validate-extensions! (utils/get-extensions csr))
(validate-csr-signature! csr)
(autosign-certificate-request! subject csr settings report-activity)
(fs/delete (path-to-cert-request csrdir subject))))))
(autosign-certificate-request! subject csr settings report-activity)))))

(schema/defn ^:always-validate delete-certificate-request! :- OutcomeInfo
"Delete pending certificate requests for subject"
[{:keys [csrdir]} :- CaSettings
subject :- schema/Str]
(let [csr-path (path-to-cert-request csrdir subject)]
(if (fs/exists? csr-path)
(if (fs/delete csr-path)
(let [msg (i18n/trs "Deleted certificate request for {0}" subject)]
(log/debug msg)
{:outcome :success
:message msg})
(let [msg (i18n/trs "Path {0} exists but could not be deleted" csr-path)]
(log/error msg)
{:outcome :error
:message msg}))
(let [msg (i18n/trs "No certificate request for {0} at expected path {1}"
subject csr-path)]
(log/warn msg)
{:outcome :not-found
:message msg}))))

(schema/defn ^:always-validate
get-certificate-revocation-list :- schema/Str
Expand Down Expand Up @@ -1884,9 +1908,7 @@
subject :- schema/Str
report-activity]
(let [csr-path (path-to-cert-request csrdir subject)]
(autosign-certificate-request! subject (utils/pem->csr csr-path) settings report-activity)
(fs/delete csr-path)
(log/debug (i18n/trs "Removed certificate request for {0} at ''{1}''" subject csr-path))))
(autosign-certificate-request! subject (utils/pem->csr csr-path) settings report-activity)))

(schema/defn filter-already-revoked-serials :- [schema/Int]
"Given a list of serials and Puppet's CA CRL, returns vector of serials with
Expand Down Expand Up @@ -2028,7 +2050,7 @@
shortnames"
[custom-oid-mapping-file :- schema/Str]
(if (fs/file? custom-oid-mapping-file)
(let [oid-mappings (:oid_mapping (yaml/parse-string (slurp custom-oid-mapping-file)))]
(let [oid-mappings (:oid_mapping (common/parse-yaml (slurp custom-oid-mapping-file)))]
(into {} (for [[oid names] oid-mappings] [(name oid) (keyword (:shortname names))])))
(log/debug (i18n/trs "No custom OID mapping configuration file found at {0}, custom OID mappings will not be loaded"
custom-oid-mapping-file))))
Expand Down Expand Up @@ -2106,9 +2128,9 @@
"Given a certificate and CaSettings create a new signed certificate using the public key from the certificate.
It recreates all the extensions in the original certificate."
[certificate :- X509Certificate
{:keys [cacert cakey auto_renewal_cert_ttl] :as ca-settings} :- CaSettings
{:keys [cacert cakey auto-renewal-cert-ttl] :as ca-settings} :- CaSettings
report-activity]
(let [validity (cert-validity-dates (or auto_renewal_cert_ttl default-auto-ttl-renewal-seconds))
(let [validity (cert-validity-dates (or auto-renewal-cert-ttl default-auto-ttl-renewal-seconds))
cacert (utils/pem->ca-cert cacert cakey)
cert-subject (utils/get-subject-from-x509-certificate certificate)
cert-name (utils/x500-name->CN cert-subject)
Expand Down
Loading

0 comments on commit 4ffae1f

Please sign in to comment.