如何用 OpenSSL 的 openssl cmp 向 CMP 服务器发起证书注册(cr)

发布时间:2026/9/12 17:36:07
如何用 OpenSSL 的 openssl cmp 向 CMP 服务器发起证书注册(cr) 如何用 OpenSSL 的 openssl cmp 向 CMP 服务器发起证书注册cr【免费下载链接】opensslGeneral purpose TLS and crypto library项目地址: https://gitcode.com/GitHub_Trending/ope/opensslopenssl cmp是 OpenSSL 内置的证书管理协议CMPRFC 9810 及其 HTTP(S) 传输 RFC 9811客户端可以用它向 CA 服务器请求证书、更新证书、申请吊销。本文聚焦其中一种命令类型crCertificate Request证书注册——为已经初始化进 PKI 层级的端实体申请一张新证书向指定的 CMP 服务器发起注册并拿到签发的证书文件。适用前提是 OpenSSL 3.0 及以上版本cmp应用自 3.0 引入以及你能访问一台 CMP 服务器如果暂时没有可用服务器文档提供的内置 mock 服务器也可以在本地完成一次完整的 cr 自测。先确认你要用的是 cr 而不是 iropenssl cmp -cmd支持六种命令注册相关的主要是前两个irInitialization Request把端实体初始化进 PKI 层级签发它的第一张证书crCertificate Request为已经初始化的端实体签发一张额外证书。选择依据很简单你的主体从未在该 CA 下注册过就用ir已经持有过证书、要再申请一张就用cr。示例配置中两段命令的差别只有一个字段见 apps/openssl.cnf[ir] cmd ir [cr] cmd cr另外记住一条限制除-cmd p10cr、-popo -1或-popo -0之外提供证明所有权POPO需要私钥。-popo的取值为-1NONE意味着中心密钥生成、0RAVERIFIED、1SIGNATURE默认、2KEYENC基于签名的 POPO 只能通过-newkey或-key提供私钥来生成。所有选项既可以写在一行长命令里也可以放进 OpenSSL 配置文件的段里用-section加载。-section可跟多个逗号分隔的段名靠后的段覆盖靠前的段命令行参数再覆盖配置。发起 cr 前需要准备哪些输入按 openssl-cmp 手册页 的选项分组一次 cr 注册需要凑齐以下四类信息服务器寻址-server格式[http[s]://][userinfo]host[:port][/path][?query][#fragment]。给出https前缀会隐含-tls_used用 TLS 时默认端口 443否则 80。没给路径时-path默认为/。IPv6 地址必须写成[::1]这种形式。接收者recipientCMP 请求消息头中 recipient 字段是必填的。可用-recipient /CN...直接给 CA 的 Distinguished Name不给时按以下顺序回退-srvcert的 subject、-issuer选项、-oldcert的 issuer、-cert的 issuer最后落到 NULL-DN。DN 必须写成/type0value0/type1value1/...格式。客户端认证二选一预共享密钥MAC-based-ref 参考值加-secret arg默认算法为 RFC 9810 定义的 PBM签名式-cert客户端证书加-key对应私钥该证书会放进 extraCerts 字段并用于签名保护。证书模板-newkey新证书的私钥或公钥文件公钥部分会被放进注册请求不给时依次回退到-csr中公钥、参考证书公钥或当前客户端密钥公钥-subject /CN...请求证书的 subject DN可选-sansSAN 扩展与-reqexts设置的 SAN 互斥、-days期望有效期天数、-reqexts 段名引用配置文件中的 X.509 扩展段、-profile放入 PKIHeader generalInfo 的证书档案名。输出-certout 文件保存新证书默认 PEM 格式-cacertsout 文件可顺带保存收到的 CA 证书caPubs字段。主路径一条命令向本地 CMP 服务器发起注册文档给出的完整命令示例是向本地 TCP 80 端口、别名为/pkix/的 CMP 服务器发初始注册-cmd ir并使用预共享密钥双向认证。由于客户端此时还没有 CA 证书所以用-recipient指明 CA 名称并用-cacertsout保存可能收到的 CA 证书openssl genrsa -out cl_key.pem openssl cmp -cmd ir -server 127.0.0.1:80/pkix/ -recipient /CNCMPserver \ -ref 1234 -secret pass:1234-5678 \ -newkey cl_key.pem -subject /CNMyName \ -cacertsout capubs.pem -certout cl_cert.pem文档明确说明这套示例中默认走 IR 消息类型但 CR 同样可用并且可以直接在命令行指定openssl cmp -section insta -cmd cr对上面这条命令做同等的 cr 改写就是openssl genrsa -out cl_key.pem openssl cmp -cmd cr -server 127.0.0.1:80/pkix/ -recipient /CNCMPserver \ -ref 1234 -secret pass:1234-5678 \ -newkey cl_key.pem -subject /CNMyName \ -cacertsout capubs.pem -certout cl_cert.pem说明几个与执行直接相关的点命令里的-server 127.0.0.1:80/pkix/、-recipient /CNCMPserver、-ref 1234、-secret pass:1234-5678、-subject /CNMyName都是文档示例值需要替换成你的 CMP 服务器地址、CA 名称、凭据和期望的 subject行尾的\只是文档为了排版换行实际执行时每条命令要写在一行消息保护摘要算法-digest默认sha256MAC 算法-mac默认hmac-sha1为兼容 RFC 4210需要时用openssl list -digest-commands和openssl list -mac-algorithms查看支持列表服务器在 TLS 之后还要求 HTTP(S) 可达-msg_timeout控制单轮请求-响应的超时默认取-total_timeout的设置而后者默认 0 即不限时。用内置示例配置发起 cr不想拼长命令时可以直接用仓库自带示例配置 apps/openssl.cnf 里的 CMP 演示段。相关段的内容如下节选自该文件[insta] # CMP using Insta Demo CA # Message transfer server pki.certificate.fi:8700 # proxy # set this as far as needed, e.g., http://192.168.1.1:8080 # tls_use 0 path pkix/ # Server authentication recipient /CFI/OInsta Demo/CNInsta Demo CA # or set srvcert or issuer ignore_keyusage 1 # quirk needed to accept Insta CA cert not including digitalsignature unprotected_errors 1 # quirk needed to accept negative responses possibly not protected extracertsout insta.extracerts.pem # Client authentication ref 3078 # user identification secret pass:insta # can be used for both client and server side # Generic message options cmd ir # default operation, can be overridden on cmd line with, e.g., kur # Certificate enrollment subject /CNopenssl-cmp-test newkey insta.priv.pem out_trusted apps/insta.ca.crt # does not include keyUsage digitalSignature certout insta.cert.pem使用方式来自 openssl-cmp 手册页 的 EXAMPLES 部分export OPENSSL_CONF/path/to/openssl/apps/openssl.cnf openssl genrsa -out insta.priv.pem openssl cmp -section insta,cr[insta]段里写的是cmd ir追加,cr后由[cr]段内容即cmd cr覆盖为 cr后加载段覆盖先加载段的规则在这里生效。执行后应生成insta.cert.pem。两个可选分支签名式保护替代预共享密钥文档示例中 CA 的信任锚是 apps/insta.ca.crt客户端可以使用从该 CA 拿到的任何一张证书做签名保护即配置中的[signature]段它引用$insta::out_trusted作 trusted$insta::newkey作 key$insta::certout作 cert并清空 secret 以禁用 PBM。组合调用openssl cmp -section insta,signature用-reqexts附加扩展-reqexts可以指向配置文件里定义 X.509 请求扩展的段例如openssl/apps/openssl.cnf中的v3_reqopenssl cmp -section insta,cr -reqexts v3_req如何确认注册成功并查看新证书成功条件在文档中很具体命令应在输出目录产生-certout指定的文件示例中为insta.cert.pem内含对应私钥insta.priv.pem的新证书。用它查看内容openssl x509 -noout -text -in insta.cert.pem如果openssl.cnf里配置了out_trusted示例指向apps/insta.ca.crt客户端会用这些信任锚在关闭证书状态检查的前提下验证新签发的证书——验证不通过会报错这也是判断响应证书是否可用的直接依据。需要保存服务器链时可用-chainout不含叶证书与信任锚。不连外部服务器用内置 mock 服务器自测 cr在没有可访问的 CMP 服务器时-use_mock_srv可以在 API 层面调用内置的 CMP 服务器 mock 做完整往返绕过 HTTP socket 传输与-server、-port互斥。仓库测试脚本 test/recipes/81-test_cmp_cli.t 里就是一个现成的 cr 组合openssl cmp -config \ -use_mock_srv -srv_ref mock server \ -srv_secret pass:test \ -rsp_cert test/certs/ee-cert-1024.pem \ -cmd cr \ -subject /CNany \ -newkey test/certs/ee-key-1024.pem \ -secret pass:test \ -ref client under test \ -certout test.certout.pem参数用途-rsp_cert指定 mock 服务器作为注册结果返回的证书-newkey是请求中携带的密钥-secret/-ref为客户端的预共享凭据-srv_ref/-srv_secret是 mock 服务端一侧的对应凭据。测试脚本的判定方式是compare_text($outfile, $rsp_cert) 0即生成的test.certout.pem与 mock 配置的test/certs/ee-cert-1024.pem内容一致。你可以在构建/测试输出目录执行并做同样的文本比较cmp命令或 diff一致即说明本次 cr 流程正常。常见报错与限制负响应被拒绝、看不到服务器给出的原因。配置调试阶段出现各种错误很正常当 CMP 服务器报告错误时客户端默认会先验证该错误响应的保护而不少 CMP 服务恰恰不保护负响应此时客户端会拒绝它错误内容里本可以用来诊断的提示就看不到了。手册页 NOTES 给出的对策是加-unprotected_errors允许接受这类未保护的错误消息、负证书响应IP/CP/KUP、负吊销响应和负 PKIConf。示例配置[insta]段里也带着unprotected_errors 1这一行并注释为接受 Insta Demo CA 负响应可能未保护的 quirk。注意文档对它的定性是“导致未定义行为”只用于与违反 RFC 9810 的服务互操作。服务器认证完全缺失。如果-trusted、-srvcert、-secret三者都没给消息验证会抛错除非-unprotected_errors允许例外。发起 cr 时至少要配好客户端认证-secret或-cert/-key与服务端验证途径之一。想固定信任某张服务器证书时可用-srvcert直接信任、忽略-trusted或更宽松地用-expect_sender只限定消息签名者名称。文档还特别提醒当你从 CMP 服务器获取将要信任的 CA 证书caPubs、caCerts、rootCaCert时服务器认证尤为关键建议配合-srvcertout保存验证通过的服务器证书并做授权检查。必须走 HTTP 代理的网络。按惯例用环境变量http_proxy或在配置文件-proxy项、命令行-proxy中给出例如-proxy http://192.168.1.1:8080POPO 相关失败。若注册被要求提供证明所有权而你的私钥不在-newkey或回退的-key中签名式 POPO 无法生成。文档提示离线场景-reqin下可临时用-popo -1或-popo -0关闭 POPO 生成对在线 cr正确做法是保证-newkey指向私钥文件加密文件时用-newkeypass提供口令不给则交互提示。不要随意使用的违反性开关-disable_confirm不发证书确认消息和-ta_in_ip_extracerts把 IP 消息 extraCerts 里的自签发证书当信任锚TOFU 式在文档中都标注了违反 RFC 9810 / RFC 4210 的 WARNING仅用于兼容特定环境不属于常规 cr 流程。版本与下一步cmp应用自 OpenSSL 3.0 引入-oldwithold、-newwithnew、-newwithold、-oldwithnew、-srvcertout、-serial及-cacertsout的扩展用法出现在 3.2-profile、-no_cache_extracerts及响应延迟投递支持在 3.3-centralkeygen、-newkeyout、-rsp_key、-rsp_keypass在 3.5-nonmatched_error_nonces在 4.1。使用这些选项前先核对你的版本。注册成功拿到certout文件之后文档给出的同类后续操作是更新证书openssl cmp -section insta,kur,signature证书更新建议不要再用 MAC-based 保护以及吊销已注册的证书openssl cmp -section insta,rr -trusted insta.ca.crt。这些是kur/rr命令的用法超出了本文 cr 的范围仅作延伸参考。【免费下载链接】opensslGeneral purpose TLS and crypto library项目地址: https://gitcode.com/GitHub_Trending/ope/openssl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询