OpenSSL :: SSL :: SSLError:SSL_connect SYSCALL返回= 5 errno = 0 state = SSLv2 / v3 read server hello A

时间:2014-07-16 15:29:29

标签: ruby ssl openssl ruby-on-rails-2

我有两台服务器,每台运行一个Rails应用程序(MyApp)。其中一个服务器设法获取wsdl,另一个没有。我不知道如何处理我的错误消息。可以任何人建议改变尝试吗?

我已经比较了两台机器上/ etc / ssl / certs的内容,它们看起来完全相同。

在两台计算机上,SSL握手与openssl s_client -connect ws2.agencyworks.com:443 -ssl3成功,但在未指定-ssl3时在服务器2上失败。 (-ssl3的替代方案,-tls1在两台计算机上都成功。)

有没有办法为openssl指定默认的ssl版本?

准系统示例(Ruby 1.8.7):

http = Net::HTTP.new 'ws2.agencyworks.com', 443
http.use_ssl = true
http.get '/EServices/services/StatusSession/wsdl/StatusSession.wsdl'

# Server 1 returns => #<Net::HTTPOK 200 OK readbody=true>
# Server 2 errors out: OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 read server hello A

有没有办法在Ruby 1.8的net / http中指定ssl版本? (我还没找到。)

1 个答案:

答案 0 :(得分:1)

这不能回答在系统级别或Rails级别为openssl设置默认ssl版本的问题,但是你可以做些什么......

在Ruby 1.8中,OpenSSL::SSL::SSLContext的实例是net / http对象用于保存openssl参数的实例,但net / http不允许您直接访问此实例变量,并且它不提供访问者:ssl_version,所以没有明显的解决方案。但是,你可以设置ssl_version ,即使在Ruby 1.8中也有以下轻微的解决方案:

Net::HTTP.ssl_context_accessor 'ssl_version'    # create accessors for ssl_version
http = Net::HTTP.new 'ws2.agencyworks.com', 443 # build http object
http.ssl_version = :TLSv1                       # set ssl_version
http.use_ssl = true
http.get '/EServices/services/StatusSession/wsdl/StatusSession.wsdl'

上面的第一行允许您在Net :: HTTP实例使用的OpenSSL :: SSL :: SSLContext实例上设置ssl_version。

其他信息

没有适用于整个应用程序的解决方案。最好,您可以使用OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:ssl_version] = :TLSv1为整个应用程序设置此项,但事实证明仅DEFAULT_PARAMS应用如果在set_params实例上调用 SSLContext,并且net / http没有这样做(至少在Ruby 1.8中)。所以这个应用程序范围的解决方案是不行的。