【问题标题】:"sslv3 alert handshake failure" on ruby 2ruby 2 上的“sslv3 警报握手失败”
【发布时间】:2016-09-29 08:23:13
【问题描述】:

我正在尝试使用带有 ruby​​ 的 web 服务,但这似乎是它的 SSL 配置和 ruby​​ 2 的问题:

>> require "open-uri"
=> true
>> open("https://w390w.gipuzkoa.net/WAS/HACI/HFAServiciosProveedoresWEB/services/FacturaSSPPWebServiceProxyPort") {|f| p f.content_type }
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: sslv3 alert handshake failure

我已经尝试过 curl 和 openssl 并且它可以工作:

curl https://w390w.gipuzkoa.net/WAS/HACI/HFAServiciosProveedoresWEB/services/FacturaSSPPWebServiceProxyPort
openssl s_client -connect w390w.gipuzkoa.net:443

它也适用于 ruby​​ 1.9:

irb(main):001:0> require "open-uri"
=> true
irb(main):003:0> open("https://w390w.gipuzkoa.net/WAS/HACI/HFAServiciosProveedoresWEB/services/FacturaSSPPWebServiceProxyPort") {|f| p f.content_type }
"text/html"

使用 ruby​​ 2,我尝试使用 TLS,但没有成功

>> OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:ssl_version] = :TLSv1
=> :TLSv1
>> open("https://w390w.gipuzkoa.net/WAS/HACI/HFAServiciosProveedoresWEB/services/FacturaSSPPWebServiceProxyPort") {|f| p f.content_type }
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=unknown state: sslv3 alert handshake failure

>> OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:ssl_version] = :TLSv1_2
=> :TLSv1_2
>> open("https://w390w.gipuzkoa.net/WAS/HACI/HFAServiciosProveedoresWEB/services/FacturaSSPPWebServiceProxyPort") {|f| p f.content_type }
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=unknown state: wrong version number

检查https://www.ssllabs.com/ssltest/analyze.html?d=w390w.gipuzkoa.net 上的服务器 SSL 配置它返回此错误:“评估失败:意外失败”,因为我可以使用 ruby​​ 2 访问几个类似的 Web 服务,我猜他们有一些配置错误。

任何想法如何使用 ruby​​ 2 访问此网络服务?

【问题讨论】:

    标签: ruby ssl ruby-2.3


    【解决方案1】:

    对于服务器来说,这是一个相当糟糕的配置。 Comodo's SSL Analyzer 似乎更宽松,并显示了四个受支持的密码套件。 另外,服务器支持TLSv1.0。

    现在,我无法在网上找到资源表明这些密码套件在 Ruby 2 中是否默认禁用,但您可以尝试以下方法:

    1. 使用OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:ciphers] = "DES-CBC3-SHA" 启用最佳密码 从OpenSSL ciphers获取的密码名。

    2. 现在尝试连接应该会显示此错误,因为站点的 CA 不受信任:

      OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 读取服务器证书 B:证书验证失败

    3. 您可以使用 ssl_ca_cert 添加此 CA,或使用 ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE 绕过验证(不推荐)。例如,

      open("https://w390w.gipuzkoa.net/WAS/HACI/HFAServiciosProveedoresWEB/services/FacturaSSPPWebServiceProxyPort", {ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE}) {|f| p f.content_type }

    你也可以试试 Net::HTTP。

    【讨论】:

    【解决方案2】:

    服务器仅支持很少的密码,大多数完全不安全(导出密码,DES-CBC-SHA)和唯一至少有点安全的密码(DES-CBC3-SHA)被认为是不安全的,因为Sweet32。由于这种不安全性,客户端中的现代 TLS 堆栈很有可能会因握手而失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-06
      • 1970-01-01
      • 2016-10-10
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      相关资源
      最近更新 更多