【发布时间】:2016-08-26 06:52:03
【问题描述】:
我们最近更新了我们网站的 SSL 证书,在 Mac OS El Capitan 10.11.3 上出现以下情况:
require 'net/http'
Net::HTTP.get URI('https://www.google.com')
# => "<HTML>...</HTML>"
# The site whose certificate got renewed
Net::HTTP.get URI('https://www.example.com')
# => OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: certificate verify failed
我在 Google 和 StackOverflow 上的所有搜索都给出了表明 Ruby 安装存在问题的答案,但它们似乎与旧 Ruby 版本有关,我认为这里不是这种情况。这是我尝试过的:
brew updatebrew upgrade opensslrvm osx-ssl-certs update all-
rvm install ruby-2.3.1 --disable-binary --with-openssl-dir="$(brew --prefix openssl)"(我之前没有这个版本) rvm requirements-
根据 Uzbekjon 的建议,
crlrefresh rpv清除 OSX 系统范围的 CRL 缓存。
我该如何解决这个问题?
注意事项:
- 在新安装的具有裸露 Ruby 2.2.3 的 linux Docker 容器上不会出现此问题。因此,这可能与 Mac OS 或 SSL 本地缓存有关。
- 此问题可能在证书续订之前就已存在。我不能确定。但是,正如我在this question 中讨论的那样,续订确实导致我们使用的第 3 方出现类似问题。
- Namecheap 验证证书安装正确,在线检查器显示一切正常,所有主要浏览器都显示证书有效。
解决方案
在 BoraMa 的大力帮助下,现在很清楚发生了什么。 COMODO 添加了一个名为 COMODO RSA Certification Authority 的新根,而不是之前的 COMODO Certification Authority。新根未在 Mac 的钥匙串中注册,导致此问题。
我们尝试调试的一种方法是运行:
openssl s_client -connect www.mysite.com:443
显示警告verify error:num=20:unable to get local issuer certificate。这个警告不是问题,因为openssl s_client 默认不使用任何证书。在将证书from COMODO 下载到comodo.pem(索引here)后,运行以下命令可以防止出现警告:
openssl s_client -connect www.mysite.com:443 -CAfile comodo.pem
但是,这不会也不会影响 Ruby OpenSSL 接口。 This article 让我更清楚了,作者创建的 SSL doctor script 也很有帮助,因为它证实了这个假设。文章建议看OpenSSL::X509::DEFAULT_CERT_FILE,对我来说是/usr/local/etc/openssl/cert.pem。我的机器上不存在该文件,这意味着 Apple 的 OpendSSL 补丁正在使用 Keychain 应用程序。无论出于何种原因,将comodo.pem 导入我的钥匙串并根据this post 将其标记为受信任都不起作用。
因此,解决方案是手动创建cert.pem 文件。我去了钥匙串应用程序,并将所有系统根证书导出到system_root.pem。然后:cat system_root.pem comodo.pem > cert.pem 并将该文件移动到/usr/local/etc/openssl/ 就可以了。在 Ruby 中运行 Net::HTTP.get 不再失败。
【问题讨论】:
-
(新)证书来自哪个证书颁发机构?或者,您能否显示站点 URL,以便我们研究证书本身?也许证书更新时证书颁发机构发生了变化,而您的 OSX 上还没有它(而它已经在新的 linux 上)。
-
感谢 BoraMa。来自 COMODO。
-
testing tool like this 是否表明它已正确配置?有时链文件的顺序不正确,一些测试人员没有验证这一点。
标签: ruby ssl openssl ssl-certificate net-http