这是我第一次try 使用XMLRPC::Client库与远程API交互,我一直收到以下错误:
warning: peer certificate won't be verified in this SSL session
我四处搜索,发现很多人都犯了这个错误.通常是使用自签名证书,他们只是想让它消失,所以他们会像XMLRPC::Client打开http会话那样做一些肮脏的事情,比如monkey patch.
我首先假设这只是客户不关心证书是否有效,所以我继续搜索,发现了this gem个.它只是强制验证所有SSL证书,如果无法验证,则会抛出一个硬错误.这正是我想要的.我包含了它,再次运行了代码,现在我得到了:
OpenSSL:SSL::SSLError:
SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B:
certificate verify failed
当然证书坏了!但我仔细判断了openssl的内置s_客户端,以确保:
openssl s_client -connect sub.example.com:443
我得到了什么:
CONNECTED(00000003)
---
Certificate chain
<snip>
Verify return code: 0 (ok)
现在我们来回答我的问题.OpenSSL(命令行版本)表示证书是好的.OpenSSL(Ruby库)不同意.我所有的网络浏览器都说证书是好的.
一些可能有用的额外细节.证书是通配符,但对域有效.openssl s_客户端在与Ruby代码相隔几秒钟的同一台机器上运行.这是与RVM一起安装的Ruby 1.8.7 p357.
Ruby使用的不是主机OS提供的CA包吗?有没有办法告诉Ruby使用特定的CA包或系统包?