比较两个 SSL 证书的最佳方法是什么?有没有权威工具?我想这样做的原因是我有 2 个证书,看似具有相同的属性,但一个有效,另一个无效。为了清楚起见,我想比较属性,我知道签名不会匹配,因为它们是在不同的时间颁发的。
答案1
使用每个在线的数据包捕获客户端。使用可以对对话进行一些分析的工具,例如 Wireshark。或者使用 ExtraHop、Dynatrace 或 LANGuardian 等在线数据分析产品。这样做的好处是,您可以看到实际使用的 TLS 实现。其中一个实现不太可能出现问题,但确实有可能。
对于查看证书,OpenSSL 并不是唯一的选择,任何可能使用证书的操作系统都会有查询证书的实用程序。PowerShell pki 模块很棒,因为您可以过滤或查看任何或所有属性。
答案2
如果一个证书有效而另一个无效,那么我首先怀疑的是这两个证书不是来自同一个私钥。
首先检查两个证书是否相同
$ openssl x509 -noout -modulus -in server.nr1.crt | openssl md5
$ openssl x509 -noout -modulus -in server.nr2.crt | openssl md5
如果这两者来自同一个 csr,那么 md5 将匹配。
按照以下步骤根据私钥检查证书,以确保证书和私钥匹配:
$ openssl x509 -noout -modulus -in server.crt | openssl md5
$ openssl rsa -noout -modulus -in server.key | openssl md5
输出的 md5 哈希值应该匹配。
您还可以检查您的 csr 以确保它与您的私钥和证书匹配。
$ openssl req -noout -modulus -in server.csr | openssl md5
答案3
Openssl 提供了一个工具来解码它们:
openssl x509 -text -in bla.pem
您随后可以使用vimdiff
它们或任何其他差异工具来进行比较。
一个猜测是,如果您包含了正确的域名,那么您是否也将它们作为“主题备用名称”包含在内?
答案4
我看到过很多对这个问题的糟糕回答。x509 证书不是按任意顺序排列的,它们也不是按任意顺序显示的,因此用 openssl 解码来目测它们不是一个好习惯。在类似的帖子中,有人建议使用 diff,但这也行不通。你应该跳过-text
选项,并添加-noout
以下是您可以添加到输出中以供比较的选项列表:
-serial
-subject_hash
-issuer_hash
-hash
-subject
-issuer
-email
-startdate
-enddate
-purpose
-dates
-modulus
-pubkey
-fingerprint
-alias
-noout
-nocert
-ocspid
-ocsp_uri
-trustout
-clrtrust
-clrext
-addtrust
-addreject
-setalias
-days
-checkend
因此,如果您想比较两个证书的指纹及其模量,您可以这样做:
diff <(openssl x509 -in cert1.pem -modulus -fingerprint) <(openssl x509 -in cert2.pem -modulus -fingerprint)