我有两台服务器,每台运行一个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版本? (我还没找到。)
答案 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中)。所以这个应用程序范围的解决方案是不行的。