OpenSSL

密码学和SSL/TLS工具包

openssl-cmp

名称

openssl-cmp - 证书管理协议 (CMP, RFC 4210) 应用程序

语法

openssl cmp [-help] [-config filename] [-section names] [-verbosity level]

通用消息选项

[-cmd ir|cr|kur|p10cr|rr|genm] [-infotype name] [-profile name] [-geninfo values]

证书注册选项

[-newkey filename|uri] [-newkeypass arg] [-subject name] [-days number] [-reqexts name] [-sans spec] [-san_nodefault] [-policies name] [-policy_oids names] [-policy_oids_critical] [-popo number] [-csr filename] [-out_trusted filenames|uris] [-implicit_confirm] [-disable_confirm] [-certout filename] [-chainout filename]

证书注册和吊销选项

[-oldcert filename|uri] [-issuer name] [-serial number] [-revreason number]

消息传输选项

[-server [http[s]://][userinfo@]host[:port][/path][?query][#fragment]] [-proxy [http[s]://][userinfo@]host[:port][/path][?query][#fragment]] [-no_proxy addresses] [-recipient name] [-path remote_path] [-keep_alive value] [-msg_timeout seconds] [-total_timeout seconds]

服务器身份验证选项

[-trusted filenames|uris] [-untrusted filenames|uris] [-srvcert filename|uri] [-expect_sender name] [-ignore_keyusage] [-unprotected_errors] [-no_cache_extracerts] [-srvcertout filename] [-extracertsout filename] [-cacertsout filename] [-oldwithold filename] [-newwithnew filename] [-newwithold filename] [-oldwithnew filename]

客户端身份验证和保护选项

[-ref value] [-secret arg] [-cert filename|uri] [-own_trusted filenames|uris] [-key filename|uri] [-keypass arg] [-digest name] [-mac name] [-extracerts filenames|uris] [-unprotected_requests]

凭据格式选项

[-certform PEM|DER] [-keyform PEM|DER|P12|ENGINE] [-otherpass arg] [-engine id] [-provider name] [-provider-path path] [-propquery propq]

随机状态选项

[-rand files] [-writerand file]

TLS连接选项

[-tls_used] [-tls_cert filename|uri] [-tls_key filename|uri] [-tls_keypass arg] [-tls_extra filenames|uris] [-tls_trusted filenames|uris] [-tls_host name]

客户端调试选项

[-batch] [-repeat number] [-reqin filenames] [-reqin_new_tid] [-reqout filenames] [-reqout_only filename] [-rspin filenames] [-rspout filenames] [-use_mock_srv]

模拟服务器选项

[-port number] [-max_msgs number] [-srv_ref value] [-srv_secret arg] [-srv_cert filename|uri] [-srv_key filename|uri] [-srv_keypass arg] [-srv_trusted filenames|uris] [-srv_untrusted filenames|uris] [-ref_cert filename|uri] [-rsp_cert filename|uri] [-rsp_extracerts filenames|uris] [-rsp_capubs filenames|uris] [-rsp_newwithnew filename|uri] [-rsp_newwithold filename|uri] [-rsp_oldwithnew filename|uri] [-poll_count number] [-check_after number] [-grant_implicitconf] [-pkistatus number] [-failure number] [-failurebits number] [-statusstring arg] [-send_error] [-send_unprotected] [-send_unprot_err] [-accept_unprotected] [-accept_unprot_err] [-accept_raverified]

证书验证选项,适用于CMP和TLS

[-allow_proxy_certs] [-attime timestamp] [-no_check_time] [-check_ss_sig] [-crl_check] [-crl_check_all] [-explicit_policy] [-extended_crl] [-ignore_critical] [-inhibit_any] [-inhibit_map] [-partial_chain] [-policy arg] [-policy_check] [-policy_print] [-purpose purpose] [-suiteB_128] [-suiteB_128_only] [-suiteB_192] [-trusted_first] [-no_alt_chains] [-use_deltas] [-auth_level num] [-verify_depth num] [-verify_email email] [-verify_hostname hostname] [-verify_ip ip] [-verify_name name] [-x509_strict] [-issuer_checks]

描述

cmp 命令是证书管理协议 (CMP) 的客户端实现,如 RFC4210 中所定义。它可用于向 CA 服务器请求证书、更新证书、请求吊销证书以及执行其他类型的 CMP 请求。

选项

-help

显示所有选项的摘要

-config filename

要使用的配置文件。空字符串""表示不使用。默认文件名来自环境变量OPENSSL_CONF

-section names

在配置文件中定义 CMP 选项的要使用的节。空字符串""表示不使用特定节。默认为cmp

可以给出多个节名称,用逗号和/或空格分隔(在后者情况下,整个参数必须用“... ”括起来)。后面命名的节的内容可能会覆盖前面命名的节的内容。无论如何,像往常一样,[default]节,最后是未命名的节(如果存在)可以提供每个选项的回退值。

-verbosity level

日志记录、错误输出等的详细程度。0 = EMERG,1 = ALERT,2 = CRIT,3 = ERR,4 = WARN,5 = NOTE,6 = INFO,7 = DEBUG,8 = TRACE。默认为 6 = INFO。

通用消息选项

-cmd ir|cr|kur|p10cr|rr|genm

要执行的 CMP 命令。当前已实现的命令有:

ir   - 初始化请求
cr   - 证书请求
p10cr - PKCS#10 证书请求(用于向后兼容)
kur   - 密钥更新请求
rr   - 吊销请求
genm - 通用消息

ir 请求通过颁发第一个证书来初始化最终实体到 PKI 层次结构中。

cr 请求为已初始化到 PKI 层次结构的最终实体颁发其他证书。

p10cr 请求类似于cr颁发其他证书,但使用传统的 PKCS#10 CSR 格式。

kur 请求现有证书的(密钥)更新。

rr 请求吊销现有证书。

genm 使用通用消息请求信息,其中可选包含的InfoTypeAndValue可用于说明哪些信息感兴趣。在收到通用响应后,有关所有接收到的 ITAV infoType的信息将打印到标准输出。

-infotype name

设置要用于在genm中请求特定信息的 InfoType 名称,例如signKeyPairTypes。到目前为止,对caCertsrootCaCert有特定的支持。

-profile name

要放置在请求消息的 PKIHeader generalInfo 字段中的证书配置文件的名称。

-geninfo values

要放置在请求消息的 PKIHeader 的 generalInfo 字段中的 InfoTypeAndValue 的逗号分隔列表。每个 InfoTypeAndValue 都提供一个 OID 和一个整数或字符串值,格式为OID:int:numberOID:str:text,例如'1.2.3.4:int:56789, id-kp:str:name'

证书注册选项

-newkey filename|uri

正在请求的证书的私钥或公钥的来源。默认为使用-csr选项提供的 PKCS#10 CSR 中的公钥、参考证书的公钥或当前客户端密钥。

密钥的公共部分将放置在证书请求中。

除非给出-cmd p10cr-popo -1-popo 0,否则还需要私钥来提供所有权证明 (POPO),其中-key选项可以提供回退。

-newkeypass arg

使用-newkey选项提供的密钥的密码短语源。如果此处未给出,则在需要时会提示输入密码。

有关arg格式的更多信息,请参阅openssl-passphrase-options(1)

-subject name

用作 IR/CR/KUR 消息中请求的证书模板中的主体字段的 X.509 区分名称 (DN)。如果给出 NULL-DN (/),则不会在模板中放置主体。默认为使用-csr选项提供的任何 PKCS#10 CSR 的主体 DN。对于 KUR,如果提供了参考证书(请参阅-oldcert),则进一步回退到其主体 DN。仅当未设置 SAN 时,此回退才用于 IR 和 CR。

如果提供并且未给出-cert-oldcert-csr,则主体 DN 将用作传出 CMP 消息的回退发送方。

参数必须格式化为/type0=value0/type1=value1/type2=...。特殊字符可以通过\(反斜杠)转义;保留空格。允许使用空值,但不会包含相应的类型。给出单个/将导致空 RDN 序列(NULL-DN)。可以通过在指定集合成员的属性值断言 (AVA) 之间放置+字符而不是/字符来形成多值 RDN。示例

/DC=org/DC=OpenSSL/DC=users/UID=123456+CN=John Doe

-days number

请求新证书有效的天数,从主机当前时间开始计算。还会触发明确请求,即有效期从主机当前时间开始(如主机所见)。

-reqexts name

OpenSSL 配置文件中定义证书请求扩展的节的名称。如果存在-csr选项,则这些扩展会增强给定 PKCS#10 CSR 中包含的扩展,覆盖任何具有相同 OID 的扩展。

-sans spec

一个或多个用逗号或空格分隔的 IP 地址、电子邮件地址、DNS 名称或 URI(在后者情况下,整个参数必须用“... ”括起来),以添加为主题备用名称 (SAN) 证书请求扩展。如果给出特殊元素“critical”,则 SAN 将被标记为关键。如果通过-reqexts设置了任何主题备用名称扩展,则不能使用。

-san_nodefault

当主题备用名称未通过-sans给出也未通过-reqexts定义时,默认情况下会从参考证书(请参阅-oldcert)复制它们。可以通过给出-san_nodefault选项来禁用此功能。

-policies name

OpenSSL 配置文件中定义要设置为证书请求扩展的策略的节的名称。此选项不能与-policy_oids一起使用。

-policy_oids names

一个或多个用逗号和/或空格分隔的 OID(在后者情况下,整个参数必须用“... ”括起来),以添加为证书策略请求扩展。此选项不能与-policies一起使用。

-policy_oids_critical

将使用-policy_oids给出的策略标记为关键。

-popo number

用于 IR/CR/KUR 的所有权证明 (POPO) 方法;值:-1..<2>,其中-1 = NONE,0 = RAVERIFIED,1 = SIGNATURE(默认值),2 = KEYENC。

请注意,只有在通过-newkey-key选项提供了私钥时,才能生成基于签名的 POPO。

-csr filename

包含证书请求的 PEM 或 DER 格式的 PKCS#10 CSR。使用-cmd p10cr时,它将直接用于传统的 P10CR 消息。

当与-cmd ircrkur一起使用时,它将转换为相应的常规 CMP 请求。在这种情况下,必须提供私钥(使用-newkey-key)以进行所有权证明(除非使用-popo -1-popo 0),并且相应的公钥将放置在证书请求中(而不是接管包含在 PKCS#10 CSR 中的公钥)。

PKCS#10 CSR 输入也可与-cmd rr一起使用,以通过包含的主体名称和公钥指定要吊销的证书。如果未给出-cert-oldcert,则其主体将用作 CMP 消息标头中的回退发送方。

-out_trusted filenames|uris

用于验证新注册证书的可信证书。在此验证期间,任何证书状态检查都将被禁用。

可以给出多个源,用逗号和/或空格分隔(在后者情况下,整个参数必须用“... ”括起来)。每个源可以包含多个证书。

证书验证选项-verify_hostname-verify_ip-verify_email仅影响通过此选项启用的证书验证。

-implicit_confirm

请求对新注册证书进行隐式确认。

-disable_confirm

对于新注册的证书,不发送证书确认消息,也不请求隐式确认,以应对不支持正确处理隐式确认的故障服务器。**警告:**这会导致违反 RFC 4210 的行为。

-certout filename

任何新注册证书应保存到的文件。

-chainout filename

任何新注册证书的证书链应保存到的文件。

证书注册和吊销选项

-oldcert filename|uri

在密钥更新请求 (KUR) 消息中要更新(即续期或重新加钥)的证书,或在撤销请求 (RR) 消息中要撤销的证书。对于 KUR,要更新的证书默认为 -cert,生成的证书称为参考证书。对于 RR,要撤销的证书也可以使用 -csr 指定。如果提供了 -issuer-serial,则忽略 -oldcert-csr

参考证书(如果有)也用于推导出 IR/CR/KUR 中请求的证书模板中的默认主体 DN 和主体备用名称以及默认的发行方条目。它的公钥在证书请求的模板中用作后备。如果未给出 -cert,则其主体用作发送传出消息的发件人。如果未给出 -recipient-srvcert-issuer,则其发行方用作 CMP 消息头中的默认接收方。

-issuer name

在 IR/CR/KUR/RR 消息中请求的证书模板中用作发行方字段的 X.509 区分名称 (DN)。如果给出 NULL-DN (/),则模板中不放置发行方。

如果提供且未给出 -recipient-srvcert,则发行方 DN 用作传出 CMP 消息的后备接收方。

参数必须格式化为/type0=value0/type1=value1/type2=...。有关详细信息,请参阅-subject选项的描述。

-serial number

指定撤销请求中要撤销证书的序列号。序列号可以是十进制或十六进制(如果以0x开头)。

-revreason number

设置要包含在撤销请求 (RR) 中的 CRLReason;值:0..10-1 表示无(默认为此值)。

RFC 5280 中定义的原因编号为

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)
 }

消息传输选项

-server [http[s]://][userinfo@]host[:port][/path][?query][#fragment]

要连接到的 CMP 服务器的host域名或 IP 地址,以及可选的port,使用 HTTP(S) 连接。IP 地址可以是 v4 或 v6,例如127.0.0.1[::1] 用于本地主机。

此选项不包括-port-use_mock_srv。如果-rspin 提供了足够的 filename 参数,则忽略此选项。

如果给出了方案https,则隐含-tls_used选项。使用 TLS 时,默认端口为 443,否则为 80。可选的 userinfo 和 fragment 组件将被忽略。任何给定的 query 组件都将作为 path 组件的一部分处理。如果包含路径,则它提供-path选项的默认值。

-proxy [http[s]://][userinfo@]host[:port][/path][?query][#fragment]

用于到达 CMP 服务器的 HTTP(S) 代理服务器,除非-no_proxy适用,请参见下文。如果方案是https,则代理端口默认为 80 或 443;除此之外,可选的http://https://前缀将被忽略(请注意,-tls_used或带有前缀https-server可能需要使用 TLS),以及任何路径、userinfo 和 query 以及 fragment 组件。如果已设置,则默认为环境变量http_proxy,否则如果未使用 TLS,则默认为HTTP_PROXY,否则如果已设置,则默认为https_proxy,否则默认为HTTPS_PROXY。如果未给出-server,则忽略此选项。

-no_proxy addresses

不使用 HTTP(S) 代理的服务器的 IP 地址和/或 DNS 名称列表,用逗号和/或空格分隔(在后者情况下,整个参数必须括在 "..." 中)。如果已设置,则默认为环境变量no_proxy,否则默认为NO_PROXY。如果未给出-server,则忽略此选项。

-recipient name

在 CMP 请求消息头(即 CMP 服务器(通常是目标 CA))的接收方字段中使用的区分名称 (DN)。

CMP 消息头中的接收方字段是必填项。如果未明确给出,则接收方按以下顺序确定:使用-srvcert选项给出的 CMP 服务器证书的主体、-issuer选项、使用-oldcert选项给出的证书的发行方、CMP 客户端证书(-cert选项)的发行方,只要其中任何一个存在,否则作为最后手段使用 NULL-DN。

参数必须格式化为/type0=value0/type1=value1/type2=...。有关详细信息,请参阅-subject选项的描述。

-path remote_path

CMP 服务器(也称为 CMP 别名)中用于 POST 请求的 HTTP 路径。默认为使用-server给出的任何路径,否则为"/"

-keep_alive value

如果给定的值为 0,则即使 CMP 事务需要多个往返,在每次响应后也会关闭 HTTP 连接(这将是 HTTP 1.0 的默认行为)。如果值为 1 或 2,则对于每个事务,都会请求持久连接。如果值为 2,则需要持久连接,即如果服务器未授予持久连接,则会发生错误。默认值为 1,这意味着更倾向于保持连接打开状态。

-msg_timeout seconds

CMP 请求-响应消息往返允许花费的秒数,之后将返回超时错误。值<= 0 表示没有限制(无限期等待)。默认为使用-total_timeout设置。

-total_timeout seconds

事务可能花费的最大总秒数,包括轮询等。值<= 0 表示没有限制(无限期等待)。默认为 0。

服务器身份验证选项

-trusted filenames|uris

客户端在验证 CMP 响应消息的基于签名的保护时将用作信任锚的证书(通常是根 CA 的证书)。如果也给出了-srvcert选项,则忽略此选项。它比-srvcert提供了更大的灵活性,因为服务器的 CMP 保护证书不会被固定,但可以是从可以构建到给定信任锚之一的链的任何证书。

如果未给出-trusted-srvcert-secret中的任何一个,则除非-unprotected_errors允许例外,否则将抛出消息验证错误。

可以给出多个源,用逗号和/或空格分隔(在后者情况下,整个参数必须用“... ”括起来)。每个源可以包含多个证书。

证书验证选项-verify_hostname-verify_ip-verify_email对通过此选项启用的证书验证没有影响。

-untrusted filenames|uris

不受信任的中间 CA 证书。使用-cert选项给出的任何额外证书都将附加到其中。所有这些证书可能对构建自己的 CMP 签名者证书的证书路径(包含在请求消息的 extraCerts 字段中)和 TLS 客户端证书(如果使用 TLS)以及在验证服务器证书(检查基于签名的 CMP 消息保护)和验证新注册的证书时构建链很有用。

可以给出多个源,用逗号和/或空格分隔(在后者情况下,整个参数必须用“... ”括起来)。每个源可以包含多个证书。

-srvcert filename|uri

在验证 CMP 响应消息的基于签名的保护时,期望并直接信任的特定 CMP 服务器证书(即使它已过期)。这将固定可接受的服务器,并导致忽略-trusted选项。

如果设置,证书的主体也将用作 CMP 请求的接收方的默认值,以及 CMP 响应的预期发送方的默认值。

-expect_sender name

在传入 CMP 消息的发件人字段中预期的区分名称 (DN)。默认为固定的-srvcert(如果有)的主体 DN。

这可用于确保仅接受特定实体作为 CMP 消息签名者,并且攻击者无法使用受信任 PKI 层次结构的任意证书来欺骗性地冒充 CMP 服务器。请注意,此选项比设置-srvcert提供了稍微更大的自由度,后者将服务器固定到特定证书的持有者,而预期的发送方名称在服务器证书更新后将继续匹配。

参数必须格式化为/type0=value0/type1=value1/type2=...。有关详细信息,请参阅-subject选项的描述。

-ignore_keyusage

在验证传入 CMP 消息的基于签名的保护时,忽略 CMP 签名者证书中的密钥使用限制。默认情况下,CMP 签名者证书必须允许digitalSignature。此选项适用于 CMP 客户端和模拟服务器。

-unprotected_errors

接受服务器发出的负面响应缺少或无效的保护。这适用于以下消息类型和内容

  • 错误消息

  • 负面证书响应 (IP/CP/KUP)

  • 负面撤销响应 (RP)

  • 负面 PKIConf 消息

**警告:**此设置会导致未指定的行为,并且专门用于允许与违反 RFC 4210 的服务器实现进行互操作,例如

  • 第 5.1.3.1 节允许仅对特殊情况的保护例外:“可能存在故意不使用 PKIProtection BIT STRING 来保护消息的某些情况 [...] 因为将改为应用外部于 PKIX 的其他保护。”

  • 第 5.3.21 节清楚地说明了 ErrMsgContent:“CA 必须始终使用签名密钥对其进行签名。”

  • 附录 D.4 显示 PKIConf 消息具有保护

-no_cache_extracerts

不缓存接收到的 CMP 消息的 extraCerts 字段中的证书。默认情况下,它们会被保留,因为它们可能有助于验证进一步的消息。此选项适用于 CMP 客户端和模拟服务器。

-srvcertout filename

要保存成功验证的证书(如果有)的文件,CMP 服务器使用该证书进行基于签名的响应消息保护。如果没有这样的证书,通常是因为保护是基于 MAC 的,则通过删除文件(如果存在)来指示这一点。

-extracertsout filename

要保存最后一个接收到的响应消息(不是 pollRep 也不时PKIConf)的 extraCerts 字段中包含的证书列表的文件。

-cacertsout filename

要保存 caPubs 字段中包含的 CA 证书列表的文件,如果收到正证书响应(即 IP、CP 或 KUP)消息,或包含在 infoType 为caCerts的通用响应 (genp) 消息中。

-oldwithold filename

要包含在 infoType 为rootCaCert的 genm 请求中的根 CA 证书。如果存在并收到可选的 oldWithNew 证书,则使用 newWithNew 证书作为(唯一)信任锚对其进行验证。

-newwithnew filename

当给出-infotype rootCaCert时,必须提供此选项。它指定保存类型为rootCaKeyUpdate的 genp 消息中收到的 newWithNew 证书的文件。如果成功但未收到此类证书,则删除此文件(如果存在)以指示请求的根 CA 证书更新不可用。

任何收到的 newWithNew 证书都将使用任何收到的 newWithOld 证书作为不受信任的中间证书以及使用-oldwithold提供的证书作为(唯一)信任锚进行验证,或者如果未提供,则使用-trusted选项给出的证书进行验证。

**警告:**newWithNew 证书旨在成为一个将被信任的证书。对其放置的信任不能强于对-oldwithold证书(如果存在)放置的信任,否则它不能强于对任何-trusted证书放置的最弱信任。

-newwithold filename

要保存类型为rootCaKeyUpdate的 genp 消息中收到的任何 newWithOld 证书的文件。如果成功但未收到此类证书,则通过删除文件来指示这一点。

-oldwithnew filename

要保存类型为rootCaKeyUpdate的 genp 消息中收到的任何 oldWithNew 证书的文件。如果成功但未收到此类证书,则通过删除文件来指示这一点。

客户端身份验证选项

-ref value

用作回退发送者KID的参考编号/字符串/值;如果无法从-cert或<-subject>选项确定发送者名称,则需要此选项,并且通常在使用预共享密钥(基于密码的MAC)进行身份验证时使用。

-secret arg

提供与基于MAC的消息保护一起使用的密钥值的来源。这优先于-cert-key选项。密钥用于创建传出消息的基于MAC的保护,以及验证具有基于MAC的保护的传入消息。默认使用的算法是RFC 4210第5.1.3.1节中定义的基于密码的消息身份验证代码(PBM)。

有关arg格式的更多信息,请参阅openssl-passphrase-options(1)

-cert filename|uri

客户端当前的CMP签名证书。需要使用-key提供相应的密钥。

此证书中包含的主体和公钥在IR/CR/KUR消息的证书模板中用作回退值。

此证书的主体将用作传出CMP消息的发送者,而-oldcert-subjectName的主体可以提供回退值。

此证书的发行者用作接收者回退值之一,以及IR/CR/KUR消息的证书模板中的回退发行者条目。

在执行基于签名的消息保护时,此“保护证书”(也称为“签名证书”)将首先包含在传出消息的extraCerts字段中,并且签名使用相应的密钥完成。在初始化请求(IR)消息中,这可以用于使用RFC 4210附录E.7中定义的外部实体证书进行身份验证。

对于密钥更新请求(KUR)消息,如果未给出-oldcert选项,这也用作要更新的证书。

如果文件包含其他证书,则将其附加到不受信任的证书,因为它们通常构成客户端证书的链,该证书包含在签名保护的请求消息的extraCerts字段中。

-own_trusted filenames|uris

如果提供了此证书列表,则使用给定的证书作为信任锚来验证为客户端CMP签名证书(使用-cert选项给出)构建的链。

可以给出多个源,用逗号和/或空格分隔(在后者情况下,整个参数必须用“... ”括起来)。每个源可以包含多个证书。

证书验证选项-verify_hostname-verify_ip-verify_email对通过此选项启用的证书验证没有影响。

-key filename|uri

客户端当前证书(在-cert选项中给出)的相应私钥文件。除非给出指示基于MAC的保护的-secret选项或-unprotected_requests,否则它将用于基于签名的消息保护。

它也用作IR/CR/KUR消息的-newkey选项的回退。

-keypass arg

使用-key选项提供的私钥的密码短语源。也用于-cert-oldcert,如果它是加密的PKCS#12文件。如果此处未给出,则在需要时将提示输入密码。

有关arg格式的更多信息,请参阅openssl-passphrase-options(1)

-digest name

指定RFC 4210的MSG_SIG_ALG中要使用的受支持摘要的名称,以及MSG_MAC_ALG中的一路函数(OWF)。如果适用,则将其用于消息保护和拥有权证明(POPO)签名。要查看受支持摘要的列表,请使用openssl list -digest-commands。默认为sha256

-mac name

指定MSG_MAC_ALG中MAC算法的名称。要获取受支持的MAC算法的名称,请使用openssl list -mac-algorithms,并可能将此类名称与受支持的摘要算法的名称组合,例如,hmacWithSHA256。根据RFC 4210,默认为hmac-sha1

-extracerts filenames|uris

在发送消息时附加到extraCerts字段中的证书。它们可以用作要包含的默认CMP签名证书链。

可以给出多个源,用逗号和/或空格分隔(在后者情况下,整个参数必须用“... ”括起来)。每个源可以包含多个证书。

-unprotected_requests

发送没有CMP级保护的请求消息。

凭据格式选项

-certform PEM|DER

将证书保存到文件时要使用的文件格式。默认值为PEM。

-keyform PEM|DER|P12|ENGINE

密钥输入的格式;默认情况下未指定。有关详细信息,请参阅openssl(1)中的“格式选项”

-otherpass arg

使用-trusted-untrusted-own_trusted-srvcert-out_trusted-extracerts-srv_trusted-srv_untrusted-ref_cert-rsp_cert-rsp_extracerts-rsp_capubs-rsp_newwithnew-rsp_newwithold-rsp_oldwithnew-tls_extra-tls_trusted选项提供的证书的密码短语源。如果此处未给出,则在需要时将提示输入密码。

有关arg格式的更多信息,请参阅openssl-passphrase-options(1)

-engine id

请参阅openssl(1)中的“引擎选项”。此选项已弃用。

作为使用此组合的替代方法

-engine {engineid} -key {keyid} -keyform ENGINE

...也可以将密钥ID以URI形式提供给-key,如下所示

-key org.openssl.engine:{engineid}:{keyid}

这适用于指定密钥的所有选项:-key-newkey-tls_key

提供程序选项

-provider name
-provider-path path
-propquery propq

请参阅openssl(1)中的“提供程序选项”provider(7)property(7)

随机状态选项

-rand files, -writerand file

有关详细信息,请参阅openssl(1)中的“随机状态选项”

TLS连接选项

-tls_used

使CMP客户端使用TLS(无论是否设置其他与TLS相关的选项)通过HTTP与服务器进行消息交换。此选项不支持-port选项。如果使用方案https给出-server选项,则隐含此选项。如果未给出-server选项或给出-use_mock_srv,或者给出-rspin并提供足够的filename参数,则忽略此选项。

如果未使用TLS,则会忽略以下与TLS相关的选项。

-tls_cert filename|uri

用于向TLS服务器进行身份验证的客户端TLS证书。如果源包含其他证书,则将它们(以及-untrusted证书)用于构建提供给TLS服务器的客户端证书链。

-tls_key filename|uri

客户端TLS证书的私钥。

-tls_keypass arg

客户端私有TLS密钥-tls_key的密码短语源。也用于-tls_cert,如果它是加密的PKCS#12文件。如果此处未给出,则在需要时将提示输入密码。

有关arg格式的更多信息,请参阅openssl-passphrase-options(1)

-tls_extra filenames|uris

在握手期间提供给TLS服务器的其他证书。

-tls_trusted filenames|uris

用于验证TLS服务器证书的可信证书。这意味着主机名验证。

可以给出多个源,用逗号和/或空格分隔(在后者情况下,整个参数必须用“... ”括起来)。每个源可以包含多个证书。

证书验证选项-verify_hostname-verify_ip-verify_email对通过此选项启用的证书验证没有影响。

-tls_host name

在主机名验证期间要检查的地址。这可能是DNS名称或IP地址。如果未给出,则默认为-server地址。

用于调试和脱机场景的客户端选项

-batch

不要交互式地提示输入,例如在需要密码时。这对于批处理和测试很有用。

-repeat number

使用相同的参数调用给定正数次的命令。默认为一次调用。

-reqin filenames

从给定文件中的CMP请求序列获取要发送到服务器的请求序列,而不是从内部生成的请求序列获取。

此选项对于支持脱机场景很有用,在脱机场景中,证书请求(或任何其他CMP请求)事先生成并在稍后发出。

如果给出-rspin选项,则忽略此选项,因为在后一种情况下,实际上不会发送任何请求。

请注意,在任何情况下,客户端都会在内部生成其CMP请求消息序列。因此,执行此操作所需的所有选项(例如-cmd和提供所需参数的所有选项)也需要在存在-reqin选项时给出。

如果为证书请求给出-reqin选项,并且未给出-newkey-key-oldcert-csr选项,则从请求消息文件(如果包含在证书模板中)获取回退公钥。

提示:如果为证书请求给出-reqin选项,则在某些情况下,客户端可以访问要认证的公钥,但无法访问默认情况下将需要的私钥以进行拥有权证明。在这种情况下,实际上不需要POPO(因为不会发送内部生成的证书请求消息),并且可以使用选项-popo -1-popo 0禁用其生成。

可以给出多个文件名,用逗号和/或空格分隔(在后一种情况下,整个参数必须括在“... ”中)。

读取文件直到完成事务并提供了文件名为止。如果需要更多请求,则从内部生成的请求序列中相应位置的项目中获取剩余请求。

客户端需要更新给定请求中的recipNonce字段(第一个请求除外),以满足服务器要执行的检查。这会导致重新保护(如果需要保护请求)。

-reqin_new_tid

为使用-reqin读取的CMP请求消息使用新的transactionID,这会导致其重新保护(如果需要保护请求)。如果重用请求序列并且CMP服务器抱怨事务ID已被使用,则可能需要这样做。

-reqout filenames

将客户端创建的CMP请求序列保存到给定文件。如果也使用-reqin选项,则这些请求不会发送到服务器。

可以给出多个文件名,用逗号和/或空格分隔。

写入文件直到保存事务并提供了文件名为止。如果事务包含更多请求,则不会保存剩余请求。

-reqout_only filename

将客户端创建的第一个CMP请求保存到给定文件并退出。任何与CMP服务器及其响应相关的选项都将被忽略。

此选项对于支持脱机场景很有用,在脱机场景中,证书请求(或任何其他CMP请求)事先生成并在稍后发出。

-rspin filenames

处理给定文件中的CMP响应序列,不联系任何给定的服务器,只要提供足够的文件名来完成事务即可。

可以给出多个文件名,用逗号和/或空格分隔。

仅当需要更多响应来完成事务时,才会联系通过-server-use_mock_srv选项指定的任何服务器。在这种情况下,除非服务器已准备好继续已启动的事务,否则事务将失败。

-rspout filenames

将实际使用的CMP响应序列保存到给定文件。除非-rspin生效,否则这些响应是从服务器接收到的。

可以给出多个文件名,用逗号和/或空格分隔。

写入文件直到保存事务中包含的响应并提供了文件名为止。如果事务包含更多响应,则不会保存剩余响应。

-use_mock_srv

在API级别使用内部CMP服务器模拟测试客户端,绕过通过HTTP的基于套接字的传输。这排除了-server-port选项。

模拟服务器选项

-port number

充当在给定本地端口上侦听的基于HTTP的CMP服务器模拟。客户端可以通过例如127.0.0.1[::1]来寻址服务器。此选项排除了-server-use_mock_srv选项。-rspin-rspout-reqin-reqout选项目前在此模式下不受支持。

-max_msgs number

CMP HTTP服务器模拟应该处理的CMP(请求)消息的最大数量,必须是非负数。默认值为0,这意味着不施加任何限制。在任何情况下,服务器都会因内部错误而终止,但不会在检测到它可以使用错误消息成功答复的CMP级错误时终止。

-srv_ref value

如果未给出-srv_cert,则用作服务器发送者KID的参考值。

-srv_secret arg

使用预共享密钥(密钥)进行服务器身份验证的密码源。

-srv_cert 文件名|uri

服务器的证书。

-srv_key 文件名|uri

服务器用于签名消息的私钥。

-srv_keypass 参数

服务器私钥(和证书)文件密码源。

-srv_trusted 文件名|uri

用于客户端身份验证的可信证书。

证书验证选项-verify_hostname-verify_ip-verify_email对通过此选项启用的证书验证没有影响。

-srv_untrusted 文件名|uri

在验证客户端证书时可能有用 中间CA证书。

-ref_cert 文件名|uri

预期用于 RR 消息和 KUR 消息中任何 oldCertID 的证书。

-rsp_cert 文件名|uri

作为模拟注册结果返回的证书。

-rsp_extracerts 文件名|uri

要包含在模拟证书响应中的额外证书。

-rsp_capubs 文件名|uri

要包含在模拟初始化响应 (IP) 消息中的 CA 证书。

-rsp_newwithnew 文件名|uri

在类型为 rootCaKeyUpdate 的 genp 的 newWithNew 字段中返回的证书。

-rsp_newwithold 文件名|uri

在类型为 rootCaKeyUpdate 的 genp 的 newWithOld 字段中返回的证书。

-rsp_oldwithnew 文件名|uri

在类型为 rootCaKeyUpdate 的 genp 的 oldWithNew 字段中返回的证书。

-poll_count 数字

客户端在收到证书之前必须轮询的次数。

-check_after 数字

要包含在轮询响应中的 checkAfter 值(等待的秒数)。

-grant_implicitconf

授予对新注册证书的隐式确认。

-pkistatus 数字

要包含在服务器响应中的 PKIStatus。有效范围是 0(已接受).. 6(keyUpdateWarning)。

-failure 数字

要包含在服务器响应中的单个故障信息位编号。有效范围是 0(badAlg).. 26(duplicateCertReq)。

-failurebits 数字 表示要包含在服务器响应中的故障位的数字。有效范围是 0 .. 2^27 - 1。
-statusstring 参数

要作为状态字符串包含在服务器响应中的文本。

-send_error

强制服务器回复错误消息。

-send_unprotected

发送没有 CMP 级别保护的响应消息。

-send_unprot_err

在出现负面响应的情况下,服务器应发送无保护的错误消息、证书响应 (IP/CP/KUP) 和吊销响应 (RP)。警告:此设置会导致违反 RFC 4210 的行为。

-accept_unprotected

接受请求中缺少或无效的保护。

-accept_unprot_err

接受来自客户端的无保护错误消息。到目前为止,这没有效果,因为服务器不接受任何错误消息。

-accept_raverified

接受 RAVERIFED 作为持有证明 (POPO)。

证书验证选项,适用于CMP和TLS

-allow_proxy_certs, -attime, -no_check_time, -check_ss_sig, -crl_check, -crl_check_all, -explicit_policy, -extended_crl, -ignore_critical, -inhibit_any, -inhibit_map, -no_alt_chains, -partial_chain, -policy, -policy_check, -policy_print, -purpose, -suiteB_128, -suiteB_128_only, -suiteB_192, -trusted_first, -use_deltas, -auth_level, -verify_depth, -verify_email, -verify_hostname, -verify_ip, -verify_name, -x509_strict -issuer_checks

设置证书链验证的各种选项。有关详细信息,请参阅openssl-verification-options(1) 中的“验证选项”

证书验证选项-verify_hostname-verify_ip-verify_email仅影响通过-out_trusted选项启用的证书验证。

注释

当客户端从 CMP 服务器获取其将要信任的 CA 证书时,例如通过证书响应的caPubs字段或使用带有 infoType caCertsrootCaCert 的通用消息,CMP 服务器的身份验证尤其重要。因此,必须特别小心地使用-trusted和相关选项设置服务器身份验证以进行基于证书的身份验证或使用-secret进行基于 MAC 的保护。如果身份验证是基于证书的,则应使用-srvcertout选项获取已验证的服务器证书并根据它执行授权检查。

在设置 CMP 配置并试验注册选项时,通常会出现各种错误,直到配置正确且完整。当 CMP 服务器报告错误时,客户端默认会检查 CMP 响应消息的保护。然而,一些 CMP 服务倾向于不保护负面响应。在这种情况下,客户端将拒绝它们,因此不会显示它们的内容,尽管它们通常包含有助于诊断的提示。为了在这种情况下提供帮助,CMP 客户端通过-unprotected_errors选项提供了一种解决方法,该选项允许接受此类负面消息。

如果 OpenSSL 构建时启用了跟踪支持(例如,./config enable-trace)并且环境变量OPENSSL_TRACE包含HTTP,则会打印通过 HTTP 传输的请求和响应标头。

示例

使用默认 OpenSSL 配置文件的简单示例

此 CMP 客户端实现附带示例配置文件openssl/apps/openssl.cnf中的演示 CMP 部分,可用于方便地与 Insta Demo CA 交互。

为了从该 CA 注册初始证书,只需发出以下 shell 命令即可。

export OPENSSL_CONF=/path/to/openssl/apps/openssl.cnf
openssl genrsa -out insta.priv.pem
openssl cmp -section insta

这应该生成文件insta.cert.pem,其中包含insta.priv.pem中保存的私钥的新证书。可以使用以下命令查看,例如:

openssl x509 -noout -text -in insta.cert.pem

如果网络设置需要使用 HTTP 代理,则可以像往常一样通过环境变量http_proxy或通过配置文件中的-proxy选项或 CMP 命令行参数-proxy给出,例如

-proxy http://192.168.1.1:8080

在 Insta Demo CA 方案中,客户端和服务器都可以使用预共享密钥insta和参考值3078相互进行身份验证。

或者,CMP 消息可以以基于签名的形式进行保护,在这种情况下,信任锚是insta.ca.crt,客户端可以使用从该 CA 获取的任何证书,如示例配置的[signature]部分中指定的那样。这可以通过以下方式与[insta]部分结合使用:

openssl cmp -section insta,signature

默认情况下使用 CMP IR 消息类型,但 CR 在此处也同样有效。这可以在命令行中直接指定

openssl cmp -section insta -cmd cr

或通过另外引用示例配置的[cr]部分

openssl cmp -section insta,cr

为了更新已注册的证书,可以调用

openssl cmp -section insta,kur

使用基于 MAC 的保护与 PBM 或

openssl cmp -section insta,kur,signature

使用基于签名的保护。

以类似的方式,任何先前注册的证书都可以通过以下方式吊销:

openssl cmp -section insta,rr -trusted insta.ca.crt

openssl cmp -section insta,rr,signature

可以在配置文件和/或命令行中给出更多选项。例如,-reqexts CLI 选项可以引用配置文件中定义要在证书请求中使用的 X.509 扩展的部分,例如openssl/apps/openssl.cnf中的v3_req

openssl cmp -section insta,cr -reqexts v3_req

证书注册

以下示例首先不使用配置文件。它们假设可以联系本地 TCP 端口 80 上的 CMP 服务器,并且在别名/pkix/下接受请求。

为了注册其第一个证书,客户端生成一个客户端密钥并将初始请求消息发送到本地 CMP 服务器,使用预共享密钥进行相互身份验证。在此示例中,客户端还没有 CA 证书,因此我们使用-recipient选项指定 CA 的名称,并将可能收到的任何 CA 证书保存在capubs.pem文件中。

在以下命令行用法示例中,行尾的\仅用于格式化;每个命令调用都应位于一行上。

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

证书更新

然后,当需要更新客户端证书及其相关的密钥对时,客户端可以发送密钥更新请求,将capubs.pem中的证书作为可信证书来验证服务器,并使用以前的证书和密钥进行自身身份验证。然后它可以开始使用新的证书和密钥。

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

此命令序列可以根据需要重复。

从 CMP 服务器请求信息

使用空通用消息请求“所有相关信息”。这会将有关所有接收到的 ITAV infoType的信息打印到标准输出。

openssl cmp -cmd genm -server 127.0.0.1/pkix/ -recipient "/CN=CMPserver" \
  -ref 1234 -secret pass:1234-5678

使用自定义配置文件

对于 CMP 客户端调用,特别是对于证书注册,通常需要设置许多参数,这在命令行中进行既繁琐又容易出错。因此,客户端提供了从 OpenSSL 配置文件(通常称为openssl.cnf)的部分读取选项的可能性。在那里找到的值仍然可以通过任何随后加载的部分和命令行进行扩展甚至覆盖。

在配置文件中包含以下部分后

[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

上述注册事务将简化为

openssl cmp -section cmp,init
openssl cmp -cmd kur -newkey cl_key_new.pem

而上面使用通用消息的事务将简化为

openssl cmp -section cmp,init -cmd genm

另请参阅

openssl-genrsa(1)openssl-ecparam(1)openssl-list(1)openssl-req(1)openssl-x509(1)x509v3_config(5)

历史

cmp应用程序是在 OpenSSL 3.0 中添加的。

-engine选项在 OpenSSL 3.0 中已弃用。

-profile选项是在 OpenSSL 3.3 中添加的。

版权所有 2007-2024 OpenSSL 项目作者。保留所有权利。

根据 Apache 许可证 2.0(“许可证”)获得许可。除非符合许可证,否则您不得使用此文件。您可以在源代码分发中的 LICENSE 文件或https://www.openssl.org/source/license.html中获取副本。