OpenSSL::SSL::SSLError: 主机名与服务器证书不匹配

5

今天早上,我的HTTP客户端(HTTParty)突然抛出了一个错误OpenSSL :: SSL :: SSLError:主机名与服务器证书不匹配

首先,我无法理解是什么原因,因为我们过去两年中几乎每天都会进行该API调用,没有任何问题。

其次,我不知道如何解决它,因为它是HTTParty内部的问题。

我唯一知道的是我不能在ENV中设置SSL_CERT_FILE,但是正如我所说,我已经在我的/etc/ssl/certsSSL_CERT_DIR)中列出了ROOT CA。

这是我的输出:

irb(main):001:0> require "openssl"
=> true
irb(main):002:0> puts OpenSSL::OPENSSL_VERSION
OpenSSL 1.0.1 14 Mar 2012
=> nil
irb(main):003:0> puts "SSL_CERT_FILE: %s" % OpenSSL::X509::DEFAULT_CERT_FILE
SSL_CERT_FILE: /usr/lib/ssl/cert.pem
=> nil
irb(main):004:0> puts "SSL_CERT_DIR: %s" % OpenSSL::X509::DEFAULT_CERT_DIR
SSL_CERT_DIR: /usr/lib/ssl/certs

最后,正如所说的,OpenSSL 没有改变,代码方面唯一发生的事情是修补 OpenSSL 版本,引用了HEARTBLEED漏洞。
请注意,我们只是修补了 OpenSSL 版本,但没有重新编译 RUBY,这可能会成为一个问题。
所涉及的 Ruby 版本是 ruby 1.9.3p327
Net::HTTP 库的版本是 httparty-0.13.0。
注意:作为解决方案,我不希望在 OpenSSL 中使用 VERIFY_NONE 选项。

请发布URL以便我们检查事情。 - jww
作为解决方案,我并不希望在OPENSSL中使用VERIFY_NONE选项 - 是的,那可能是最不理想的选择。你可以使用匿名Diffie-Hellman并保存服务器证书的麻烦。 - jww
突然间,HTTParty 抛出了“主机名与服务器证书不匹配”的错误...... OpenSSL 1.0.1 和之前的版本不执行主机名匹配。主机名匹配是1.0.2的功能,而那个版本的OpenSSL尚未发布。因此,HTTParty或Ruby中的某些内容发生了变化。 - jww
我已经核对了我们的Ruby版本和httparty gem,它们在过去一年中一直保持不变,除此之外我也不知道该说什么了。 - Viren
1个回答

1

如果您连接的主机不清楚,那么很难确定,但我猜测他们只是在服务器端更改了证书。问题可能是,您的脚本不支持SNI(服务器名称指示,例如多个主机名和证书位于同一个IP后面),但服务器提供商现在为此站点更改了默认证书(如果客户端不支持SNI,则使用该证书)。

但正如我所说的,在这个问题缺乏细节的情况下很难确定。


我该如何检查这个问题,同时我注意到错误不再出现了,我现在不知道为什么突然停止出现那些OPENSSL错误。 - Viren
1
您可以使用 openssl s_client -connect ..(无SNI)和 openssl s_client -connect .. -servername ...(带有SNI)进行检查。而且,您不再收到错误可能是由于服务器端的更改引起的。 - Steffen Ullrich
使用像这样的openssl是相当新的,我必须承认我觉得很有趣,但我不知道命令输出中大部分数据的含义,这是你让我运行的命令的输出:https://gist.github.com/anonymous/11136536 - Ratatouille
只是为了检查,当我在所有三种情况下执行“GET /”时,我能够获得200。 - Ratatouille
1
如果您查看CN=..行或将证书(大的base64 blob)粘贴到openssl x509 -text中,您会发现CN与主机名匹配,而主题备用名称也匹配www.admin.myvideochatnetwork.com。因此,目前一切正常,下次出现问题时,您可以使用`s_client`检查是否有人搞乱了服务器设置。 - Steffen Ullrich
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接