| =pod |
| {- OpenSSL::safe::output_do_not_edit_headers(); -} |
| |
| =head1 NAME |
| |
| openssl-cmp - Certificate Management Protocol (CMP, RFC 4210) application |
| |
| =head1 SYNOPSIS |
| |
| B<openssl> B<cmp> |
| [B<-help>] |
| [B<-config> I<filename>] |
| [B<-section> I<names>] |
| [B<-verbosity> I<level>] |
| |
| Generic message options: |
| |
| [B<-cmd> I<ir|cr|kur|p10cr|rr|genm>] |
| [B<-infotype> I<name>] |
| [B<-geninfo> I<OID:int:N>] |
| |
| Certificate enrollment options: |
| |
| [B<-newkey> I<filename>|I<uri>] |
| [B<-newkeypass> I<arg>] |
| [B<-subject> I<name>] |
| [B<-issuer> I<name>] |
| [B<-days> I<number>] |
| [B<-reqexts> I<name>] |
| [B<-sans> I<spec>] |
| [B<-san_nodefault>] |
| [B<-policies> I<name>] |
| [B<-policy_oids> I<names>] |
| [B<-policy_oids_critical>] |
| [B<-popo> I<number>] |
| [B<-csr> I<filename>] |
| [B<-out_trusted> I<filenames>|I<uris>] |
| [B<-implicit_confirm>] |
| [B<-disable_confirm>] |
| [B<-certout> I<filename>] |
| [B<-chainout> I<filename>] |
| |
| Certificate enrollment and revocation options: |
| |
| [B<-oldcert> I<filename>|I<uri>] |
| [B<-revreason> I<number>] |
| |
| Message transfer options: |
| |
| [B<-server> I<[http[s]://][userinfo@]host[:port][/path][?query][#fragment]>] |
| [B<-proxy> I<[http[s]://][userinfo@]host[:port][/path][?query][#fragment]>] |
| [B<-no_proxy> I<addresses>] |
| [B<-recipient> I<name>] |
| [B<-path> I<remote_path>] |
| [B<-keep_alive> I<value>] |
| [B<-msg_timeout> I<seconds>] |
| [B<-total_timeout> I<seconds>] |
| |
| Server authentication options: |
| |
| [B<-trusted> I<filenames>|I<uris>] |
| [B<-untrusted> I<filenames>|I<uris>] |
| [B<-srvcert> I<filename>|I<uri>] |
| [B<-expect_sender> I<name>] |
| [B<-ignore_keyusage>] |
| [B<-unprotected_errors>] |
| [B<-extracertsout> I<filename>] |
| [B<-cacertsout> I<filename>] |
| |
| Client authentication and protection options: |
| |
| [B<-ref> I<value>] |
| [B<-secret> I<arg>] |
| [B<-cert> I<filename>|I<uri>] |
| [B<-own_trusted> I<filenames>|I<uris>] |
| [B<-key> I<filename>|I<uri>] |
| [B<-keypass> I<arg>] |
| [B<-digest> I<name>] |
| [B<-mac> I<name>] |
| [B<-extracerts> I<filenames>|I<uris>] |
| [B<-unprotected_requests>] |
| |
| Credentials format options: |
| |
| [B<-certform> I<PEM|DER>] |
| [B<-keyform> I<PEM|DER|P12|ENGINE>] |
| [B<-otherpass> I<arg>] |
| {- $OpenSSL::safe::opt_engine_synopsis -}{- $OpenSSL::safe::opt_provider_synopsis -} |
| |
| Random state options: |
| |
| {- $OpenSSL::safe::opt_r_synopsis -} |
| |
| TLS connection options: |
| |
| [B<-tls_used>] |
| [B<-tls_cert> I<filename>|I<uri>] |
| [B<-tls_key> I<filename>|I<uri>] |
| [B<-tls_keypass> I<arg>] |
| [B<-tls_extra> I<filenames>|I<uris>] |
| [B<-tls_trusted> I<filenames>|I<uris>] |
| [B<-tls_host> I<name>] |
| |
| Client-side debugging options: |
| |
| [B<-batch>] |
| [B<-repeat> I<number>] |
| [B<-reqin> I<filenames>] |
| [B<-reqin_new_tid>] |
| [B<-reqout> I<filenames>] |
| [B<-rspin> I<filenames>] |
| [B<-rspout> I<filenames>] |
| [B<-use_mock_srv>] |
| |
| Mock server options: |
| |
| [B<-port> I<number>] |
| [B<-max_msgs> I<number>] |
| [B<-srv_ref> I<value>] |
| [B<-srv_secret> I<arg>] |
| [B<-srv_cert> I<filename>|I<uri>] |
| [B<-srv_key> I<filename>|I<uri>] |
| [B<-srv_keypass> I<arg>] |
| [B<-srv_trusted> I<filenames>|I<uris>] |
| [B<-srv_untrusted> I<filenames>|I<uris>] |
| [B<-ref_cert> I<filename>|I<uri>] |
| [B<-rsp_cert> I<filename>|I<uri>] |
| [B<-rsp_extracerts> I<filenames>|I<uris>] |
| [B<-rsp_capubs> I<filenames>|I<uris>] |
| [B<-poll_count> I<number>] |
| [B<-check_after> I<number>] |
| [B<-grant_implicitconf>] |
| [B<-pkistatus> I<number>] |
| [B<-failure> I<number>] |
| [B<-failurebits> I<number>] |
| [B<-statusstring> I<arg>] |
| [B<-send_error>] |
| [B<-send_unprotected>] |
| [B<-send_unprot_err>] |
| [B<-accept_unprotected>] |
| [B<-accept_unprot_err>] |
| [B<-accept_raverified>] |
| |
| Certificate verification options, for both CMP and TLS: |
| |
| {- $OpenSSL::safe::opt_v_synopsis -} |
| |
| =head1 DESCRIPTION |
| |
| The B<cmp> command is a client implementation for the Certificate |
| Management Protocol (CMP) as defined in RFC4210. |
| It can be used to request certificates from a CA server, |
| update their certificates, |
| request certificates to be revoked, and perform other types of CMP requests. |
| |
| =head1 OPTIONS |
| |
| =over 4 |
| |
| =item B<-help> |
| |
| Display a summary of all options |
| |
| =item B<-config> I<filename> |
| |
| Configuration file to use. |
| An empty string C<""> means none. |
| Default filename is from the environment variable C<OPENSSL_CONF>. |
| |
| =item B<-section> I<names> |
| |
| Section(s) to use within config file defining CMP options. |
| An empty string C<""> means no specific section. |
| Default is C<cmp>. |
| |
| Multiple section names may be given, separated by commas and/or whitespace |
| (where in the latter case the whole argument must be enclosed in "..."). |
| Contents of sections named later may override contents of sections named before. |
| In any case, as usual, the C<[default]> section and finally the unnamed |
| section (as far as present) can provide per-option fallback values. |
| |
| =item B<-verbosity> I<level> |
| |
| Level of verbosity for logging, error output, etc. |
| 0 = EMERG, 1 = ALERT, 2 = CRIT, 3 = ERR, 4 = WARN, 5 = NOTE, |
| 6 = INFO, 7 = DEBUG, 8 = TRACE. |
| Defaults to 6 = INFO. |
| |
| =back |
| |
| =head2 Generic message options |
| |
| =over 4 |
| |
| =item B<-cmd> I<ir|cr|kur|p10cr|rr|genm> |
| |
| CMP command to execute. |
| Currently implemented commands are: |
| |
| =over 8 |
| |
| =item ir E<nbsp> - Initialization Request |
| |
| =item cr E<nbsp> - Certificate Request |
| |
| =item p10cr - PKCS#10 Certification Request (for legacy support) |
| |
| =item kur E<nbsp>E<nbsp>- Key Update Request |
| |
| =item rr E<nbsp> - Revocation Request |
| |
| =item genm - General Message |
| |
| =back |
| |
| B<ir> requests initialization of an end entity into a PKI hierarchy |
| by issuing a first certificate. |
| |
| B<cr> requests issuing an additional certificate for an end entity already |
| initialized to the PKI hierarchy. |
| |
| B<p10cr> requests issuing an additional certificate similarly to B<cr> |
| but using legacy PKCS#10 CSR format. |
| |
| B<kur> requests a (key) update for an existing certificate. |
| |
| B<rr> requests revocation of an existing certificate. |
| |
| B<genm> requests information using a General Message, where optionally |
| included B<InfoTypeAndValue>s may be used to state which info is of interest. |
| Upon receipt of the General Response, information about all received |
| ITAV B<infoType>s is printed to stdout. |
| |
| =item B<-infotype> I<name> |
| |
| Set InfoType name to use for requesting specific info in B<genm>, |
| e.g., C<signKeyPairTypes>. |
| |
| =item B<-geninfo> I<OID:int:N> |
| |
| generalInfo integer values to place in request PKIHeader with given OID, |
| e.g., C<1.2.3.4:int:56789>. |
| |
| =back |
| |
| =head2 Certificate enrollment options |
| |
| =over 4 |
| |
| =item B<-newkey> I<filename>|I<uri> |
| |
| The source of the private or public key for the certificate requested |
| in Initialization Request (IR), Certification Request(CR), or |
| Key Update Request (KUR). |
| Defaults to the public key in the PKCS#10 CSR given with the B<-csr> option, |
| the public key of the reference certificate, or the current client key. |
| |
| =item B<-newkeypass> I<arg> |
| |
| Pass phrase source for the key given with the B<-newkey> option. |
| If not given here, the password will be prompted for if needed. |
| |
| For more information about the format of I<arg> see |
| L<openssl-passphrase-options(1)>. |
| |
| =item B<-subject> I<name> |
| |
| X509 Distinguished Name (DN) of subject to use in the requested certificate |
| template. |
| For KUR, it defaults to the public key |
| in the PKCS#10 CSR given with the B<-csr> option, if provided, |
| or of the reference certificate (see B<-oldcert>) if provided. |
| This default is used for IR and CR only if no SANs are set. |
| If the NULL-DN (C<"/">) is given then no subject is placed in the template. |
| |
| If provided and neither of B<-cert>, B<-oldcert>, or B<-csr> is given, |
| the subject DN is used as fallback sender of outgoing CMP messages. |
| |
| The argument must be formatted as I</type0=value0/type1=value1/type2=...>. |
| Special characters may be escaped by C<\> (backslash); whitespace is retained. |
| Empty values are permitted, but the corresponding type will not be included. |
| Giving a single C</> will lead to an empty sequence of RDNs (a NULL-DN). |
| Multi-valued RDNs can be formed by placing a C<+> character instead of a C</> |
| between the AttributeValueAssertions (AVAs) that specify the members of the set. |
| Example: |
| |
| C</DC=org/DC=OpenSSL/DC=users/UID=123456+CN=John Doe> |
| |
| =item B<-issuer> I<name> |
| |
| X509 issuer Distinguished Name (DN) of the CA server |
| to place in the requested certificate template in IR/CR/KUR. |
| If the NULL-DN (C<"/">) is given then no issuer is placed in the template. |
| |
| If provided and neither B<-recipient> nor B<-srvcert> is given, |
| the issuer DN is used as fallback recipient of outgoing CMP messages. |
| |
| The argument must be formatted as I</type0=value0/type1=value1/type2=...>. |
| For details see the description of the B<-subject> option. |
| |
| =item B<-days> I<number> |
| |
| Number of days the new certificate is requested to be valid for, counting from |
| the current time of the host. |
| Also triggers the explicit request that the |
| validity period starts from the current time (as seen by the host). |
| |
| =item B<-reqexts> I<name> |
| |
| Name of section in OpenSSL config file defining certificate request extensions. |
| If the B<-csr> option is present, these extensions augment the extensions |
| contained the given PKCS#10 CSR, overriding any extensions with same OIDs. |
| |
| =item B<-sans> I<spec> |
| |
| One or more IP addresses, email addresses, DNS names, or URIs |
| separated by commas or whitespace |
| (where in the latter case the whole argument must be enclosed in "...") |
| to add as Subject Alternative Name(s) (SAN) certificate request extension. |
| If the special element "critical" is given the SANs are flagged as critical. |
| Cannot be used if any Subject Alternative Name extension is set via B<-reqexts>. |
| |
| =item B<-san_nodefault> |
| |
| When Subject Alternative Names are not given via B<-sans> |
| nor defined via B<-reqexts>, |
| they are copied by default from the reference certificate (see B<-oldcert>). |
| This can be disabled by giving the B<-san_nodefault> option. |
| |
| =item B<-policies> I<name> |
| |
| Name of section in OpenSSL config file defining policies to be set |
| as certificate request extension. |
| This option cannot be used together with B<-policy_oids>. |
| |
| =item B<-policy_oids> I<names> |
| |
| One or more OID(s), separated by commas and/or whitespace |
| (where in the latter case the whole argument must be enclosed in "...") |
| to add as certificate policies request extension. |
| This option cannot be used together with B<-policies>. |
| |
| =item B<-policy_oids_critical> |
| |
| Flag the policies given with B<-policy_oids> as critical. |
| |
| =item B<-popo> I<number> |
| |
| Proof-of-Possession (POPO) method to use for IR/CR/KUR; values: C<-1>..<2> where |
| C<-1> = NONE, C<0> = RAVERIFIED, C<1> = SIGNATURE (default), C<2> = KEYENC. |
| |
| Note that a signature-based POPO can only be produced if a private key |
| is provided via the B<-newkey> or B<-key> options. |
| |
| =item B<-csr> I<filename> |
| |
| PKCS#10 CSR in PEM or DER format containing a certificate request. |
| With B<-cmd> I<p10cr> it is used directly in a legacy P10CR message. |
| When used with B<-cmd> I<ir>, I<cr>, or I<kur>, it is transformed into the |
| respective regular CMP request. |
| It may also be used with B<-cmd> I<rr> to specify the certificate to be revoked |
| via the included subject name and public key. |
| Its subject is used as fallback sender in CMP message headers |
| if B<-cert> and B<-oldcert> are not given. |
| |
| =item B<-out_trusted> I<filenames>|I<uris> |
| |
| Trusted certificate(s) to use for validating the newly enrolled certificate. |
| |
| Multiple sources may be given, separated by commas and/or whitespace |
| (where in the latter case the whole argument must be enclosed in "..."). |
| Each source may contain multiple certificates. |
| |
| The certificate verification options |
| B<-verify_hostname>, B<-verify_ip>, and B<-verify_email> |
| only affect the certificate verification enabled via this option. |
| |
| =item B<-implicit_confirm> |
| |
| Request implicit confirmation of newly enrolled certificates. |
| |
| =item B<-disable_confirm> |
| |
| Do not send certificate confirmation message for newly enrolled certificate |
| without requesting implicit confirmation |
| to cope with broken servers not supporting implicit confirmation correctly. |
| B<WARNING:> This leads to behavior violating RFC 4210. |
| |
| =item B<-certout> I<filename> |
| |
| The file where the newly enrolled certificate should be saved. |
| |
| =item B<-chainout> I<filename> |
| |
| The file where the chain of the newly enrolled certificate should be saved. |
| |
| =back |
| |
| =head2 Certificate enrollment and revocation options |
| |
| =over 4 |
| |
| =item B<-oldcert> I<filename>|I<uri> |
| |
| The certificate to be updated (i.e., renewed or re-keyed) in Key Update Request |
| (KUR) messages or to be revoked in Revocation Request (RR) messages. |
| For KUR the certificate to be updated defaults to B<-cert>, |
| and the resulting certificate is called I<reference certificate>. |
| For RR the certificate to be revoked can also be specified using B<-csr>. |
| |
| The reference certificate, if any, is also used for |
| deriving default subject DN and Subject Alternative Names and the |
| default issuer entry in the requested certificate template of an IR/CR/KUR. |
| Its subject is used as sender of outgoing messages if B<-cert> is not given. |
| Its issuer is used as default recipient in CMP message headers |
| if neither B<-recipient>, B<-srvcert>, nor B<-issuer> is given. |
| |
| =item B<-revreason> I<number> |
| |
| Set CRLReason to be included in revocation request (RR); values: C<0>..C<10> |
| or C<-1> for none (which is the default). |
| |
| Reason numbers defined in RFC 5280 are: |
| |
| CRLReason ::= ENUMERATED { |
| unspecified (0), |
| keyCompromise (1), |
| cACompromise (2), |
| affiliationChanged (3), |
| superseded (4), |
| cessationOfOperation (5), |
| certificateHold (6), |
| -- value 7 is not used |
| removeFromCRL (8), |
| privilegeWithdrawn (9), |
| aACompromise (10) |
| } |
| |
| =back |
| |
| =head2 Message transfer options |
| |
| =over 4 |
| |
| =item B<-server> I<[http[s]://][userinfo@]host[:port][/path][?query][#fragment]> |
| |
| The DNS hostname or IP address and optionally port |
| of the CMP server to connect to using HTTP(S). |
| This excludes I<-port> and I<-use_mock_srv> and is ignored with I<-rspin>. |
| |
| The scheme C<https> may be given only if the B<-tls_used> option is provided. |
| In this case the default port is 443, else 80. |
| The optional userinfo and fragment components are ignored. |
| Any given query component is handled as part of the path component. |
| If a path is included it provides the default value for the B<-path> option. |
| |
| =item B<-proxy> I<[http[s]://][userinfo@]host[:port][/path][?query][#fragment]> |
| |
| The HTTP(S) proxy server to use for reaching the CMP server unless B<-no_proxy> |
| applies, see below. |
| The proxy port defaults to 80 or 443 if the scheme is C<https>; apart from that |
| the optional C<http://> or C<https://> prefix is ignored (note that TLS may be |
| enabled by B<-tls_used>), as well as any path, userinfo, and query, and fragment |
| components. |
| Defaults to the environment variable C<http_proxy> if set, else C<HTTP_PROXY> |
| in case no TLS is used, otherwise C<https_proxy> if set, else C<HTTPS_PROXY>. |
| This option is ignored if I<-server> is not given. |
| |
| =item B<-no_proxy> I<addresses> |
| |
| List of IP addresses and/or DNS names of servers |
| not to use an HTTP(S) proxy for, separated by commas and/or whitespace |
| (where in the latter case the whole argument must be enclosed in "..."). |
| Default is from the environment variable C<no_proxy> if set, else C<NO_PROXY>. |
| This option is ignored if I<-server> is not given. |
| |
| =item B<-recipient> I<name> |
| |
| Distinguished Name (DN) to use in the recipient field of CMP request message |
| headers, i.e., the CMP server (usually the addressed CA). |
| |
| The recipient field in the header of a CMP message is mandatory. |
| If not given explicitly the recipient is determined in the following order: |
| the subject of the CMP server certificate given with the B<-srvcert> option, |
| the B<-issuer> option, |
| the issuer of the certificate given with the B<-oldcert> option, |
| the issuer of the CMP client certificate (B<-cert> option), |
| as far as any of those is present, else the NULL-DN as last resort. |
| |
| The argument must be formatted as I</type0=value0/type1=value1/type2=...>. |
| For details see the description of the B<-subject> option. |
| |
| =item B<-path> I<remote_path> |
| |
| HTTP path at the CMP server (aka CMP alias) to use for POST requests. |
| Defaults to any path given with B<-server>, else C<"/">. |
| |
| =item B<-keep_alive> I<value> |
| |
| If the given value is 0 then HTTP connections are not kept open |
| after receiving a response, which is the default behavior for HTTP 1.0. |
| If the value is 1 or 2 then persistent connections are requested. |
| If the value is 2 then persistent connections are required, |
| i.e., in case the server does not grant them an error occurs. |
| The default value is 1, which means preferring to keep the connection open. |
| |
| =item B<-msg_timeout> I<seconds> |
| |
| Number of seconds (or 0 for infinite) a CMP request-response message round trip |
| is allowed to take before a timeout error is returned. |
| Default is to use the B<-total_timeout> setting. |
| |
| =item B<-total_timeout> I<seconds> |
| |
| Maximum number seconds an overall enrollment transaction may take, |
| including attempts polling for certificates on C<waiting> PKIStatus. |
| Default is 0 (infinite). |
| |
| =back |
| |
| =head2 Server authentication options |
| |
| =over 4 |
| |
| =item B<-trusted> I<filenames>|I<uris> |
| |
| When validating signature-based protection of CMP response messages, |
| these are the CA certificate(s) to trust while checking certificate chains |
| during CMP server authentication. |
| This option gives more flexibility than the B<-srvcert> option because the |
| server-side CMP signer certificate is not pinned but may be any certificate |
| for which a chain to one of the given trusted certificates can be constructed. |
| |
| If no B<-trusted>, B<-srvcert>, and B<-secret> option is given |
| then protected response messages from the server are not authenticated. |
| |
| Multiple sources may be given, separated by commas and/or whitespace |
| (where in the latter case the whole argument must be enclosed in "..."). |
| Each source may contain multiple certificates. |
| |
| The certificate verification options |
| B<-verify_hostname>, B<-verify_ip>, and B<-verify_email> |
| have no effect on the certificate verification enabled via this option. |
| |
| =item B<-untrusted> I<filenames>|I<uris> |
| |
| Non-trusted intermediate CA certificate(s). |
| Any extra certificates given with the B<-cert> option are appended to it. |
| All these certificates may be useful for cert path construction |
| for the CMP client certificate (to include in the extraCerts field of outgoing |
| messages) and for the TLS client certificate (if TLS is enabled) |
| as well as for chain building |
| when validating the CMP server certificate (checking signature-based |
| CMP message protection) and when validating newly enrolled certificates. |
| |
| Multiple sources may be given, separated by commas and/or whitespace. |
| Each file may contain multiple certificates. |
| |
| =item B<-srvcert> I<filename>|I<uri> |
| |
| The specific CMP server certificate to expect and directly trust (even if it is |
| expired) when validating signature-based protection of CMP response messages. |
| May be set alternatively to the B<-trusted> option to pin the accepted server. |
| |
| If set, the subject of the certificate is also used |
| as default value for the recipient of CMP requests |
| and as default value for the expected sender of incoming CMP messages. |
| |
| =item B<-expect_sender> I<name> |
| |
| Distinguished Name (DN) expected in the sender field of incoming CMP messages. |
| Defaults to the subject DN of the pinned B<-srvcert>, if any. |
| |
| This can be used to make sure that only a particular entity is accepted as |
| CMP message signer, and attackers are not able to use arbitrary certificates |
| of a trusted PKI hierarchy to fraudulently pose as a CMP server. |
| Note that this option gives slightly more freedom than setting the B<-srvcert>, |
| which pins the server to the holder of a particular certificate, while the |
| expected sender name will continue to match after updates of the server cert. |
| |
| The argument must be formatted as I</type0=value0/type1=value1/type2=...>. |
| For details see the description of the B<-subject> option. |
| |
| =item B<-ignore_keyusage> |
| |
| Ignore key usage restrictions in CMP signer certificates when validating |
| signature-based protection of incoming CMP messages, |
| else C<digitalSignature> must be allowed for signer certificate. |
| |
| =item B<-unprotected_errors> |
| |
| Accept missing or invalid protection of negative responses from the server. |
| This applies to the following message types and contents: |
| |
| =over 4 |
| |
| =item * error messages |
| |
| =item * negative certificate responses (IP/CP/KUP) |
| |
| =item * negative revocation responses (RP) |
| |
| =item * negative PKIConf messages |
| |
| =back |
| |
| B<WARNING:> This setting leads to unspecified behavior and it is meant |
| exclusively to allow interoperability with server implementations violating |
| RFC 4210, e.g.: |
| |
| =over 4 |
| |
| =item * section 5.1.3.1 allows exceptions from protecting only for special |
| cases: |
| "There MAY be cases in which the PKIProtection BIT STRING is deliberately not |
| used to protect a message [...] because other protection, external to PKIX, will |
| be applied instead." |
| |
| =item * section 5.3.21 is clear on ErrMsgContent: "The CA MUST always sign it |
| with a signature key." |
| |
| =item * appendix D.4 shows PKIConf message having protection |
| |
| =back |
| |
| =item B<-extracertsout> I<filename> |
| |
| The file where to save all certificates contained in the extraCerts field |
| of the last received response message (except for pollRep and PKIConf). |
| |
| =item B<-cacertsout> I<filename> |
| |
| The file where to save any CA certificates contained in the caPubs field of |
| the last received certificate response (i.e., IP, CP, or KUP) message. |
| |
| =back |
| |
| =head2 Client authentication options |
| |
| =over 4 |
| |
| =item B<-ref> I<value> |
| |
| Reference number/string/value to use as fallback senderKID; this is required |
| if no sender name can be determined from the B<-cert> or <-subject> options and |
| is typically used when authenticating with pre-shared key (password-based MAC). |
| |
| =item B<-secret> I<arg> |
| |
| Prefer PBM-based message protection with given source of a secret value. |
| The secret is used for creating PBM-based protection of outgoing messages |
| and (as far as needed) for validating PBM-based protection of incoming messages. |
| PBM stands for Password-Based Message Authentication Code. |
| This takes precedence over the B<-cert> and B<-key> options. |
| |
| For more information about the format of I<arg> see |
| L<openssl-passphrase-options(1)>. |
| |
| =item B<-cert> I<filename>|I<uri> |
| |
| The client's current CMP signer certificate. |
| Requires the corresponding key to be given with B<-key>. |
| The subject of this certificate will be used as sender of outgoing CMP messages, |
| while the subject of B<-oldcert> or B<-subjectName> may provide fallback values. |
| The issuer of this certificate is used as one of the recipient fallback values |
| and as fallback issuer entry in the certificate template of IR/CR/KUR. |
| When using signature-based message protection, this "protection certificate" |
| will be included first in the extraCerts field of outgoing messages |
| and the signature is done with the corresponding key. |
| In Initialization Request (IR) messages this can be used for authenticating |
| using an external entity certificate as defined in appendix E.7 of RFC 4210. |
| For Key Update Request (KUR) messages this is also used as |
| the certificate to be updated if the B<-oldcert> option is not given. |
| If the file includes further certs, they are appended to the untrusted certs |
| because they typically constitute the chain of the client certificate, which |
| is included in the extraCerts field in signature-protected request messages. |
| |
| =item B<-own_trusted> I<filenames>|I<uris> |
| |
| If this list of certificates is provided then the chain built for |
| the client-side CMP signer certificate given with the B<-cert> option |
| is verified using the given certificates as trust anchors. |
| |
| Multiple sources may be given, separated by commas and/or whitespace |
| (where in the latter case the whole argument must be enclosed in "..."). |
| Each source may contain multiple certificates. |
| |
| The certificate verification options |
| B<-verify_hostname>, B<-verify_ip>, and B<-verify_email> |
| have no effect on the certificate verification enabled via this option. |
| |
| =item B<-key> I<filename>|I<uri> |
| |
| The corresponding private key file for the client's current certificate given in |
| the B<-cert> option. |
| This will be used for signature-based message protection unless |
| the B<-secret> option indicating PBM or B<-unprotected_requests> is given. |
| |
| =item B<-keypass> I<arg> |
| |
| Pass phrase source for the private key given with the B<-key> option. |
| Also used for B<-cert> and B<-oldcert> in case it is an encrypted PKCS#12 file. |
| If not given here, the password will be prompted for if needed. |
| |
| For more information about the format of I<arg> see |
| L<openssl-passphrase-options(1)>. |
| |
| =item B<-digest> I<name> |
| |
| Specifies name of supported digest to use in RFC 4210's MSG_SIG_ALG |
| and as the one-way function (OWF) in MSG_MAC_ALG. |
| If applicable, this is used for message protection and |
| Proof-of-Possession (POPO) signatures. |
| To see the list of supported digests, use C<openssl list -digest-commands>. |
| Defaults to C<sha256>. |
| |
| =item B<-mac> I<name> |
| |
| Specifies the name of the MAC algorithm in MSG_MAC_ALG. |
| To get the names of supported MAC algorithms use C<openssl list -mac-algorithms> |
| and possibly combine such a name with the name of a supported digest algorithm, |
| e.g., hmacWithSHA256. |
| Defaults to C<hmac-sha1> as per RFC 4210. |
| |
| =item B<-extracerts> I<filenames>|I<uris> |
| |
| Certificates to append in the extraCerts field when sending messages. |
| They can be used as the default CMP signer certificate chain to include. |
| |
| Multiple sources may be given, separated by commas and/or whitespace |
| (where in the latter case the whole argument must be enclosed in "..."). |
| Each source may contain multiple certificates. |
| |
| =item B<-unprotected_requests> |
| |
| Send messages without CMP-level protection. |
| |
| =back |
| |
| =head2 Credentials format options |
| |
| =over 4 |
| |
| =item B<-certform> I<PEM|DER> |
| |
| File format to use when saving a certificate to a file. |
| Default value is PEM. |
| |
| =item B<-keyform> I<PEM|DER|P12|ENGINE> |
| |
| The format of the key input; unspecified by default. |
| See L<openssl(1)/Format Options> for details. |
| |
| =item B<-otherpass> I<arg> |
| |
| Pass phrase source for certificate given with the B<-trusted>, B<-untrusted>, |
| B<-own_trusted>, B<-srvcert>, B<-out_trusted>, B<-extracerts>, |
| B<-srv_trusted>, B<-srv_untrusted>, B<-rsp_extracerts>, B<-rsp_capubs>, |
| B<-tls_extra>, and B<-tls_trusted> options. |
| If not given here, the password will be prompted for if needed. |
| |
| For more information about the format of I<arg> see |
| L<openssl-passphrase-options(1)>. |
| |
| {- $OpenSSL::safe::opt_engine_item -} |
| |
| {- output_off() if $disabled{"deprecated-3.0"}; "" -} |
| As an alternative to using this combination: |
| |
| -engine {engineid} -key {keyid} -keyform ENGINE |
| |
| ... it's also possible to just give the key ID in URI form to B<-key>, |
| like this: |
| |
| -key org.openssl.engine:{engineid}:{keyid} |
| |
| This applies to all options specifying keys: B<-key>, B<-newkey>, and |
| B<-tls_key>. |
| {- output_on() if $disabled{"deprecated-3.0"}; "" -} |
| |
| =back |
| |
| =head2 Provider options |
| |
| =over 4 |
| |
| {- $OpenSSL::safe::opt_provider_item -} |
| |
| =back |
| |
| =head2 Random state options |
| |
| =over 4 |
| |
| {- $OpenSSL::safe::opt_r_item -} |
| |
| =back |
| |
| =head2 TLS connection options |
| |
| =over 4 |
| |
| =item B<-tls_used> |
| |
| Enable using TLS (even when other TLS-related options are not set) |
| for message exchange with CMP server via HTTP. |
| This option is not supported with the I<-port> option |
| and is ignored with the I<-use_mock_srv> and I<-rspin> options |
| or if the I<-server> option is not given. |
| |
| The following TLS-related options are ignored if B<-tls_used> is not given. |
| |
| =item B<-tls_cert> I<filename>|I<uri> |
| |
| Client's TLS certificate to use for authenticating to the TLS server. |
| If the source includes further certs they are used (along with B<-untrusted> |
| certs) for constructing the client cert chain provided to the TLS server. |
| |
| =item B<-tls_key> I<filename>|I<uri> |
| |
| Private key for the client's TLS certificate. |
| |
| =item B<-tls_keypass> I<arg> |
| |
| Pass phrase source for client's private TLS key B<-tls_key>. |
| Also used for B<-tls_cert> in case it is an encrypted PKCS#12 file. |
| If not given here, the password will be prompted for if needed. |
| |
| For more information about the format of I<arg> see |
| L<openssl-passphrase-options(1)>. |
| |
| =item B<-tls_extra> I<filenames>|I<uris> |
| |
| Extra certificates to provide to the TLS server during handshake. |
| |
| =item B<-tls_trusted> I<filenames>|I<uris> |
| |
| Trusted certificate(s) to use for validating the TLS server certificate. |
| This implies hostname validation. |
| |
| Multiple sources may be given, separated by commas and/or whitespace |
| (where in the latter case the whole argument must be enclosed in "..."). |
| Each source may contain multiple certificates. |
| |
| The certificate verification options |
| B<-verify_hostname>, B<-verify_ip>, and B<-verify_email> |
| have no effect on the certificate verification enabled via this option. |
| |
| =item B<-tls_host> I<name> |
| |
| Address to be checked during hostname validation. |
| This may be a DNS name or an IP address. |
| If not given it defaults to the B<-server> address. |
| |
| =back |
| |
| =head2 Client-side debugging options |
| |
| =over 4 |
| |
| =item B<-batch> |
| |
| Do not interactively prompt for input, for instance when a password is needed. |
| This can be useful for batch processing and testing. |
| |
| =item B<-repeat> I<number> |
| |
| Invoke the command the given positive number of times with the same parameters. |
| Default is one invocation. |
| |
| =item B<-reqin> I<filenames> |
| |
| Take sequence of CMP requests from file(s). |
| |
| Multiple filenames may be given, separated by commas and/or whitespace |
| (where in the latter case the whole argument must be enclosed in "..."). |
| As many files are read as needed for a complete transaction. |
| |
| =item B<-reqin_new_tid> |
| |
| Use a fresh transactionID for CMP request messages read using B<-reqin>, |
| which requires re-protecting them as far as they were protected before. |
| This may be needed in case the sequence of requests is reused |
| and the CMP server complains that the transaction ID has already been used. |
| |
| =item B<-reqout> I<filenames> |
| |
| Save sequence of CMP requests to file(s). |
| |
| Multiple filenames may be given, separated by commas and/or whitespace. |
| As many files are written as needed to store the complete transaction. |
| |
| =item B<-rspin> I<filenames> |
| |
| Process sequence of CMP responses provided in file(s), skipping server. |
| This excludes I<-server>, I<-port>, and I<-use_mock_srv>. |
| |
| Multiple filenames may be given, separated by commas and/or whitespace. |
| As many files are read as needed for the complete transaction. |
| |
| =item B<-rspout> I<filenames> |
| |
| Save sequence of CMP responses to file(s). |
| |
| Multiple filenames may be given, separated by commas and/or whitespace. |
| As many files are written as needed to store the complete transaction. |
| |
| =item B<-use_mock_srv> |
| |
| Test the client using the internal CMP server mock-up at API level, |
| bypassing socket-based transfer via HTTP. |
| This excludes I<-server>, I<-port>, and I<-rspin>. |
| |
| =back |
| |
| =head2 Mock server options |
| |
| =over 4 |
| |
| =item B<-port> I<number> |
| |
| Act as HTTP-based CMP server mock-up listening on the given port. |
| This excludes I<-server>, I<-rspin>, and I<-use_mock_srv>. |
| |
| =item B<-max_msgs> I<number> |
| |
| Maximum number of CMP (request) messages the CMP HTTP server mock-up |
| should handle, which must be nonnegative. |
| The default value is 0, which means that no limit is imposed. |
| In any case the server terminates on internal errors, but not when it |
| detects a CMP-level error that it can successfully answer with an error message. |
| |
| =item B<-srv_ref> I<value> |
| |
| Reference value to use as senderKID of server in case no B<-srv_cert> is given. |
| |
| =item B<-srv_secret> I<arg> |
| |
| Password source for server authentication with a pre-shared key (secret). |
| |
| =item B<-srv_cert> I<filename>|I<uri> |
| |
| Certificate of the server. |
| |
| =item B<-srv_key> I<filename>|I<uri> |
| |
| Private key used by the server for signing messages. |
| |
| =item B<-srv_keypass> I<arg> |
| |
| Server private key (and cert) file pass phrase source. |
| |
| =item B<-srv_trusted> I<filenames>|I<uris> |
| |
| Trusted certificates for client authentication. |
| |
| The certificate verification options |
| B<-verify_hostname>, B<-verify_ip>, and B<-verify_email> |
| have no effect on the certificate verification enabled via this option. |
| |
| =item B<-srv_untrusted> I<filenames>|I<uris> |
| |
| Intermediate CA certs that may be useful when validating client certificates. |
| |
| =item B<-ref_cert> I<filename>|I<uri> |
| |
| Certificate to be expected for RR messages and any oldCertID in KUR messages. |
| |
| =item B<-rsp_cert> I<filename>|I<uri> |
| |
| Certificate to be returned as mock enrollment result. |
| |
| =item B<-rsp_extracerts> I<filenames>|I<uris> |
| |
| Extra certificates to be included in mock certification responses. |
| |
| =item B<-rsp_capubs> I<filenames>|I<uris> |
| |
| CA certificates to be included in mock Initialization Response (IP) message. |
| |
| =item B<-poll_count> I<number> |
| |
| Number of times the client must poll before receiving a certificate. |
| |
| =item B<-check_after> I<number> |
| |
| The checkAfter value (number of seconds to wait) to include in poll response. |
| |
| =item B<-grant_implicitconf> |
| |
| Grant implicit confirmation of newly enrolled certificate. |
| |
| =item B<-pkistatus> I<number> |
| |
| PKIStatus to be included in server response. |
| Valid range is 0 (accepted) .. 6 (keyUpdateWarning). |
| |
| =item B<-failure> I<number> |
| |
| A single failure info bit number to be included in server response. |
| Valid range is 0 (badAlg) .. 26 (duplicateCertReq). |
| |
| =item B<-failurebits> I<number> |
| Number representing failure bits to be included in server response. |
| Valid range is 0 .. 2^27 - 1. |
| |
| =item B<-statusstring> I<arg> |
| |
| Text to be included as status string in server response. |
| |
| =item B<-send_error> |
| |
| Force server to reply with error message. |
| |
| =item B<-send_unprotected> |
| |
| Send response messages without CMP-level protection. |
| |
| =item B<-send_unprot_err> |
| |
| In case of negative responses, server shall send unprotected error messages, |
| certificate responses (IP/CP/KUP), and revocation responses (RP). |
| WARNING: This setting leads to behavior violating RFC 4210. |
| |
| =item B<-accept_unprotected> |
| |
| Accept missing or invalid protection of requests. |
| |
| =item B<-accept_unprot_err> |
| |
| Accept unprotected error messages from client. |
| |
| =item B<-accept_raverified> |
| |
| Accept RAVERIFED as proof-of-possession (POPO). |
| |
| =back |
| |
| =head2 Certificate verification options, for both CMP and TLS |
| |
| =over 4 |
| |
| {- $OpenSSL::safe::opt_v_item -} |
| |
| The certificate verification options |
| B<-verify_hostname>, B<-verify_ip>, and B<-verify_email> |
| only affect the certificate verification enabled via the B<-out_trusted> option. |
| |
| =back |
| |
| =head1 NOTES |
| |
| When setting up CMP configurations and experimenting with enrollment options |
| typically various errors occur until the configuration is correct and complete. |
| When the CMP server reports an error the client will by default |
| check the protection of the CMP response message. |
| Yet some CMP services tend not to protect negative responses. |
| In this case the client will reject them, and thus their contents are not shown |
| although they usually contain hints that would be helpful for diagnostics. |
| For assisting in such cases the CMP client offers a workaround via the |
| B<-unprotected_errors> option, which allows accepting such negative messages. |
| |
| =head1 EXAMPLES |
| |
| =head2 Simple examples using the default OpenSSL configuration file |
| |
| This CMP client implementation comes with demonstrative CMP sections |
| in the example configuration file F<openssl/apps/openssl.cnf>, |
| which can be used to interact conveniently with the Insta Demo CA. |
| |
| In order to enroll an initial certificate from that CA it is sufficient |
| to issue the following shell commands. |
| |
| export OPENSSL_CONF=/path/to/openssl/apps/openssl.cnf |
| |
| =begin comment |
| |
| wget 'http://pki.certificate.fi:8081/install-ca-cert.html/ca-certificate.crt\ |
| ?ca-id=632&download-certificate=1' -O insta.ca.crt |
| |
| =end comment |
| |
| openssl genrsa -out insta.priv.pem |
| openssl cmp -section insta |
| |
| This should produce the file F<insta.cert.pem> containing a new certificate |
| for the private key held in F<insta.priv.pem>. |
| It can be viewed using, e.g., |
| |
| openssl x509 -noout -text -in insta.cert.pem |
| |
| In case the network setup requires using an HTTP proxy it may be given as usual |
| via the environment variable B<http_proxy> or via the B<-proxy> option in the |
| configuration file or the CMP command-line argument B<-proxy>, for example |
| |
| -proxy http://192.168.1.1:8080 |
| |
| In the Insta Demo CA scenario both clients and the server may use the pre-shared |
| secret I<insta> and the reference value I<3078> to authenticate to each other. |
| |
| Alternatively, CMP messages may be protected in signature-based manner, |
| where the trust anchor in this case is F<insta.ca.crt> |
| and the client may use any certificate already obtained from that CA, |
| as specified in the B<[signature]> section of the example configuration. |
| This can be used in combination with the B<[insta]> section simply by |
| |
| openssl cmp -section insta,signature |
| |
| By default the CMP IR message type is used, yet CR works equally here. |
| This may be specified directly at the command line: |
| |
| openssl cmp -section insta -cmd cr |
| |
| or by referencing in addition the B<[cr]> section of the example configuration: |
| |
| openssl cmp -section insta,cr |
| |
| In order to update the enrolled certificate one may call |
| |
| openssl cmp -section insta,kur |
| |
| using with PBM-based protection or |
| |
| openssl cmp -section insta,kur,signature |
| |
| using signature-based protection. |
| |
| In a similar way any previously enrolled certificate may be revoked by |
| |
| openssl cmp -section insta,rr -trusted insta.ca.crt |
| |
| or |
| |
| openssl cmp -section insta,rr,signature |
| |
| Many more options can be given in the configuration file |
| and/or on the command line. |
| For instance, the B<-reqexts> CLI option may refer to a section in the |
| configuration file defining X.509 extensions to use in certificate requests, |
| such as C<v3_req> in F<openssl/apps/openssl.cnf>: |
| |
| openssl cmp -section insta,cr -reqexts v3_req |
| |
| =head2 Certificate enrollment |
| |
| The following examples do not make use of a configuration file at first. |
| They assume that a CMP server can be contacted on the local TCP port 80 |
| and accepts requests under the alias I</pkix/>. |
| |
| For enrolling its very first certificate the client generates a client key |
| and sends an initial request message to the local CMP server |
| using a pre-shared secret key for mutual authentication. |
| In this example the client does not have the CA certificate yet, |
| so we specify the name of the CA with the B<-recipient> option |
| and save any CA certificates that we may receive in the C<capubs.pem> file. |
| |
| In below command line usage examples the C<\> at line ends is used just |
| for formatting; each of the command invocations should be on a single line. |
| |
| openssl genrsa -out cl_key.pem |
| openssl cmp -cmd ir -server 127.0.0.1:80/pkix/ -recipient "/CN=CMPserver" \ |
| -ref 1234 -secret pass:1234-5678 \ |
| -newkey cl_key.pem -subject "/CN=MyName" \ |
| -cacertsout capubs.pem -certout cl_cert.pem |
| |
| =head2 Certificate update |
| |
| Then, when the client certificate and its related key pair needs to be updated, |
| the client can send a key update request taking the certs in C<capubs.pem> |
| as trusted for authenticating the server and using the previous cert and key |
| for its own authentication. |
| Then it can start using the new cert and key. |
| |
| openssl genrsa -out cl_key_new.pem |
| openssl cmp -cmd kur -server 127.0.0.1:80/pkix/ \ |
| -trusted capubs.pem \ |
| -cert cl_cert.pem -key cl_key.pem \ |
| -newkey cl_key_new.pem -certout cl_cert.pem |
| cp cl_key_new.pem cl_key.pem |
| |
| This command sequence can be repated as often as needed. |
| |
| =head2 Requesting information from CMP server |
| |
| Requesting "all relevant information" with an empty General Message. |
| This prints information about all received ITAV B<infoType>s to stdout. |
| |
| openssl cmp -cmd genm -server 127.0.0.1/pkix/ -recipient "/CN=CMPserver" \ |
| -ref 1234 -secret pass:1234-5678 |
| |
| =head2 Using a custom configuration file |
| |
| For CMP client invocations, in particular for certificate enrollment, |
| usually many parameters need to be set, which is tedious and error-prone to do |
| on the command line. |
| Therefore, the client offers the possibility to read |
| options from sections of the OpenSSL config file, usually called F<openssl.cnf>. |
| The values found there can still be extended and even overridden by any |
| subsequently loaded sections and on the command line. |
| |
| After including in the configuration file the following sections: |
| |
| [cmp] |
| server = 127.0.0.1 |
| path = pkix/ |
| trusted = capubs.pem |
| cert = cl_cert.pem |
| key = cl_key.pem |
| newkey = cl_key.pem |
| certout = cl_cert.pem |
| |
| [init] |
| recipient = "/CN=CMPserver" |
| trusted = |
| cert = |
| key = |
| ref = 1234 |
| secret = pass:1234-5678-1234-567 |
| subject = "/CN=MyName" |
| cacertsout = capubs.pem |
| |
| the above enrollment transactions reduce to |
| |
| openssl cmp -section cmp,init |
| openssl cmp -cmd kur -newkey cl_key_new.pem |
| |
| and the above transaction using a general message reduces to |
| |
| openssl cmp -section cmp,init -cmd genm |
| |
| =head1 SEE ALSO |
| |
| L<openssl-genrsa(1)>, L<openssl-ecparam(1)>, L<openssl-list(1)>, |
| L<openssl-req(1)>, L<openssl-x509(1)>, L<x509v3_config(5)> |
| |
| =head1 HISTORY |
| |
| The B<cmp> application was added in OpenSSL 3.0. |
| |
| The B<-engine option> was deprecated in OpenSSL 3.0. |
| |
| =head1 COPYRIGHT |
| |
| Copyright 2007-2022 The OpenSSL Project Authors. All Rights Reserved. |
| |
| Licensed under the Apache License 2.0 (the "License"). You may not use |
| this file except in compliance with the License. You can obtain a copy |
| in the file LICENSE in the source distribution or at |
| L<https://www.openssl.org/source/license.html>. |
| |
| =cut |