证书与私钥匹配器
粘贴服务器正在使用的证书和你准备与之一起部署的私钥,本页回答部署站点最常翻车的问题:这两者是否来自同一对密钥?答案不是靠模长或指纹的猜测 — 本页用私钥对一个固定挑战签名,再用证书内的公钥验证该签名。验证通过,两者匹配;验证失败,再怎么改配置也无法让它们工作。两侧的读取结果并排显示算法、密钥长度、主体密钥标识符与公钥指纹,你粘贴的任何内容都不会离开浏览器。
把私钥粘贴进任何网页之前都值得三思。本页是一个纯 JavaScript 文件,不从任何地方加载任何东西,也不发出任何请求,所以密钥在本标签页内被读取、使用然后遗忘。这仍然是你能读懂的代码做出的承诺,而不是看得见的网络给出的保证:如果你在处理生产密钥,请离线操作,并考虑最安全的检查是在自己的服务器上运行同样的 openssl 命令。粘贴到这里的密钥绝不会被存储、绝不会被写入文件、绝不会被发送到任何地方 — 包括导出按钮在内,它们只写关于密钥的结论,绝不写密钥本身。
为什么签名才是答案。两个文件可以看起来一样却仍是错配:大多数指南用模数比较 RSA 密钥,但那只对 RSA 有效,而且一把密钥可以带着正确的模数却配了损坏的指数或错误的填充。本页用握手的方式来证明配对 — 用私钥对固定挑战签名,用证书里的公钥验证 — 因此结论对 RSA、ECDSA 和 Ed25519 同样成立。当只粘贴了公钥一半时,会比较公钥字节本身,这对身份判定同样结论明确,只是无法证明有人持有私钥一半。
匹配不能告诉你什么。它不能说明服务器实际加载的就是这把密钥、证书受信任、密钥文件在磁盘上完好,或密钥没有被别人复制。它也不能说明客户端收到的是不是这张证书,因为站点前面的负载均衡器或 CDN 可能发送另一张。要检查在线服务器真正呈现的内容,请运行 openssl s_client -connect example.com:443 -servername example.com -showcerts 并把输出粘贴到证书框。
文件从哪里来。证书是你的服务器配置的那张,或从浏览器导出、从 .p7b bundle 里取出的那张。私钥是你的 web 服务器启动时读取的文件,通常类似 privkey.pem 或 server.key。如果你的密钥是加密的,先用 openssl pkcs8 -topk8 -nocrypt -in key.pem -out key-plain.pem 解密一份副本,粘贴它,然后删除副本。
尚未检查。在上方粘贴证书和密钥并按检查是否匹配。结论会连同其依据一起出现在这里,报告可以复制或保存。
在你自己的机器上用 openssl 做同样的检查
# 证书内的公钥
openssl x509 -in cert.pem -noout -pubkey | openssl pkey -pubin -outform DER | openssl sha256
# 私钥内的公钥
openssl pkey -in key.pem -pubout | openssl pkey -pubin -outform DER | openssl sha256
# 只有两者的摘要相等时,这对密钥才匹配
# 较老的仅 RSA 方式:比较模数
openssl x509 -in cert.pem -noout -modulus | openssl md5
openssl rsa -in key.pem -noout -modulus | openssl md5
摘要比较适用于所有密钥类型,与本页报告的公钥指纹一致;模数比较只存在于 RSA。两者都证明不了有人持有私钥一半 — 上面的签名检查可以,这正是本页采用它的原因。
报告里有什么。结论、得出结论的两侧读取结果(证书与密钥各自的算法、密钥长度、曲线、主体密钥标识符与公钥指纹),以及运行的确切测试。报告绝不包含私钥本身:密钥只被用来产生一个签名,不会写入文本、JSON 或剪贴板。你复制或保存的内容可以安全地附到工单里;你粘贴的密钥不可以,并且你应当把剪贴板当作它存在过的唯一另一个地方。
隐私:证书与密钥都在标签页内读取,不上传任何内容,本页完全不发出请求 — 没有探测也没有查询。要创建一对匹配的密钥请用
自签名证书生成器;要为已有密钥申请证书请用
CSR 生成器;要阅读证书内容请用
证书解码器。