这些问题中的另一个,我知道这个问题已经在StackOverflow上被提出(并且已经回答了很多),但我无法让任何这些问题适合我,我也有一些问题我想要学习。
这是我的错误:
OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv3 read server hello A
首先,这是我的系统设置。
我在OSX El Capitan版本10.11.6上
openssl version
OpenSSL 0.9.8zh 14 Jan 2016
which openssl
/usr/bin/openssl
ruby -v
ruby 2.1.6p336 (2015-04-13 revision 50298) [x86_64-darwin14.0]
rbenv -v
rbenv 0.4.0
我的问题是这些:
1)此错误是否意味着证书已发回给我,然后我的OpenSSL版本无法验证它?其他服务器是否有机会阅读我的,甚至看到它?有没有办法使用Net :: HTTP深入研究这个请求,除了打开像Wireshark这样的程序之外还要检查一下?一旦我调用net :: HTTP.new.request(request),我似乎失去了控制,而且只是错误。
2)我是否成功地与其他服务器通话,它否认了我?
3)当我收到此消息时,请求中的哪一点?
并且最重要的是
4)我有什么选择可以超越这一点
5)部署到Heroku时,我是否会遇到此问题?
从我正在阅读的内容来看,这是我的操作系统不包含正确CA文件的问题。 ca_file
部分是由于我第一次尝试将正确的ca_file添加到我的请求中。我猜我不需要那个。我正在使用带有heroku的代理,因为此API需要静态IP。
这是我的通用代码
cert = File.read(File.join(Rails.root, 'ssl', 'test_env', 'their_test_cert.der'))
ca_file = File.read(File.join(Rails.root, 'ssl', 'test_env', 'Class3PublicPrimaryCA.der'))
uri = URI("https://xml.theirtestenv.com/api/receive")
headers = {
'x-IK-Version' => 'IKR/V4.00',
}
proxy_host = "myproxyhose"
proxy_port = "1234"
proxy_user = "myproxyuser"
proxy_pass = "myproxypass"
proxy_request = Net::HTTP.new(uri.hostname, '443', proxy_host, proxy_port, proxy_user, proxy_pass)
# http.key = OpenSSL::PKey::RSA.new(rsa_key)
proxy_request.use_ssl = true
proxy_request.cert = OpenSSL::X509::Certificate.new(cert)
proxy_request.ca_file = ca_file
proxy_request.verify_mode = OpenSSL::SSL::VERIFY_PEER
# proxy_request.ssl_version = :SSLv3
# This doesn't seem to matter whether I put this or not...
# Tried variations of these...
# proxy_request.ssl_version = :TLSv1
# proxy_request.ciphers = ['DES-CBC3-SHA']
post_request = Net::HTTP::Post.new(uri, headers)
post_request.content_type = "multipart/related"
response = proxy_request.request(post_request)
puts response.inspect
此外,我注意到无论我放置proxy_requst.ssl_version
,我的错误总是指定SSLv2 / v3,这是否意味着他们需要该版本?
对不起所有问题。提前致谢
答案 0 :(得分:0)
已经有一段时间了,但我只是想说明这是几个问题,我传递的证书不是正确的,它们用于错误的环境。一旦通过了正确的证书,它就开始工作了,尽管我从来没有完全弄清楚 SSL 版本问题。