我在 Mac 上使用 OpenSSL 0.9.8zc 创建了一个自签名证书(和 CA)。我使用该证书来保护与 svn 服务器的连接。随着最新的 OS X 更新,OpenSSL 已更新至 0.9.8zd。现在我无法连接到我的服务器,svn 提示“证书验证失败”。
使用 openssl 验证:
openssl verify -CAfile ~/Desktop/Certificates.pem -check_ss_sig ~/Downloads/svn.pem
我明白了
~/Downloads/svn.pem: /CN=My Open Directory Certification Authority/O=Me/OU=MACOSX OpenDirectory Root CA/emailAddress=webmaster@me
error 7 at 2 depth lookup:certificate signature failure
看起来我的 CA 签名现在被视为“损坏”。我的问题:
我该如何进一步调查以查明我的证书到底哪里“损坏”,以免重复这个错误?
有没有办法解决这个问题,除了重新颁发以 CA 开头的每个证书?
答案1
这似乎是证书助理产生的一个问题,它会产生微妙的格式错误的证书,而 openssl 0.9.8zd 的新严格检查会拒绝这些证书。这来自 openssl.org 上的讨论1
它最后包含一个 python 脚本来修复我成功使用的 .pem 证书,我引用它以防链接坏了......
from pyasn1.codec.der import decoder, encoder
from pyasn1_modules import pem, rfc2459
cert_der = pem.readPemFromFile(open("RabbitMQ_Test.pem", "r"))
cert, _ = decoder.decode(cert_der, asn1Spec=rfc2459.Certificate())
cert.setComponentByName("signatureAlgorithm",
cert.getComponentByName("tbsCertificate").
getComponentByName("signature"))
fixed_cert_pem = open("RabbitMQ_Test_Fixed.pem", "w")
fixed_cert_pem.write("-----BEGIN CERTIFICATE-----\n")
fixed_cert_pem.write(encoder.encode(cert).encode("base64"))
fixed_cert_pem.write("-----END CERTIFICATE-----\n")
fixed_cert_pem.close()
答案2
如果你使用的是 OS X 10.10.3,并且刚刚出现以下情况:
注意:这只是一个临时解决办法,问题似乎出在更上游的地方
我在将 OSX 升级到 10.10.3 后突然出现此错误 - 正如您所说,似乎此错误是由他们所包含的新版本的 OpenSSL (0.9.8zd) 引起的。
在我们彻底解决这个问题之前,我利用了 Homebrew 的 OpenSSL 包来解决这个问题 -
$ brew update
$ brew install openssl
$ brew link openssl --force
你可能还需要更新过期的证书,使用 rvm 只需运行
$ rvm osx-ssl-certs update all
但听起来你知道你在那里做什么
值得注意的是,Homebrew 建议反对链接 openssl,因此一旦上游解决了这个问题,您可能需要运行它来清理我们造成的混乱:
$ brew unlink openssl
答案3
当我尝试使用客户端和服务器证书连接到在 10.10.3 上运行的 Apache 服务器时,我遇到了类似的问题。python 脚本在 SSL 服务器证书上工作,以供 Apache 使用,但 Safari 仍然无法使用钥匙串中的客户端证书连接到服务器;Apache 服务器拒绝了客户端证书。
我必须导出客户端证书,在其上使用 python 脚本,然后将其重新导入钥匙串以替换原始证书。