Ruby 使用Mechanize的SSL错误
我在Ruby 使用Mechanize的SSL错误,ruby,ssl,openssl,mechanize,Ruby,Ssl,Openssl,Mechanize,我在irb require 'mechanize' agent = Mechanize.new agent.get('https://monabo.lemonde.fr/customer/account/forgotpassword/') 我得到了这个错误: OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=unknown state: sslv3 alert handshake failure 我在mac电脑上试过了,
irb
require 'mechanize'
agent = Mechanize.new
agent.get('https://monabo.lemonde.fr/customer/account/forgotpassword/')
我得到了这个错误:
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=unknown state: sslv3 alert handshake failure
我在mac电脑上试过了,但我没有这个错误。但是,它在我的计算机上不工作(运行LinuxMint17)
我尝试的是:
- 导出此变量:
export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
agent.agent.http.ca_file = '/etc/ssl/certs/ca-certificates.crt'
- 设置此变量:
export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
agent.agent.http.ca_file = '/etc/ssl/certs/ca-certificates.crt'
- 设置此选项:
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
- 更改ruby版本(我目前正在使用ruby 2.1.5p275)
https://google.com
与机械化
一起工作,但不https://monabo.lemonde.fr/customer/account/forgotpassword/
。
它在mac上运行的事实可能会认为我的配置错误
编辑:以下是此命令的输出:
➜ swiff git:(master) ✗ openssl s_client -connect monabo.lemonde.fr/customer/account/forgotpassword:443 -tls1 -servername monabo.lemonde.fr/customer/account/forgotpassword | openssl x509 -text -noout
gethostbyname failure
connect:errno=0
unable to load certificate
140045809014432:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:703:Expecting: TRUSTED CERTIFICATE
其他一些数据:
-CApath
来解决下面的“无法获取本地颁发者证书”错误(练习留给读者,因为这不是问题所在)
这可能有助于您排除故障
获取证书转储
$ openssl s_client -connect monabo.lemonde.fr:443 -tls1 -servername monabo.lemonde.fr | openssl x509 -text -noout
depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign Domain Validation CA - G2
verify error:num=20:unable to get local issuer certificate
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
11:21:56:eb:c5:b1:54:fb:88:02:47:ec:cd:51:d9:38:89:d2
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=BE, O=GlobalSign nv-sa, CN=GlobalSign Domain Validation CA - G2
Validity
Not Before: Dec 18 17:19:34 2013 GMT
Not After : Jan 19 18:10:24 2017 GMT
Subject: OU=Domain Control Validated, CN=*.lemonde.fr
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:d3:59:62:60:4e:18:52:3d:f5:f9:e2:54:5a:dd:
54:09:05:27:ae:f9:42:20:d6:ff:0a:5f:97:64:33:
64:5c:9a:80:67:de:6a:be:f9:6a:cb:1c:14:14:df:
90:cb:77:9a:d9:22:15:45:eb:ac:9a:c3:36:1f:52:
ee:22:b5:9f:67:22:35:52:64:e0:4e:44:f8:ab:01:
3a:e8:f6:57:81:27:3b:28:3c:b1:da:e2:59:12:63:
99:89:e2:ed:bf:42:09:4c:39:f3:d7:2e:4a:5d:d1:
d7:4c:d1:cd:2c:98:f9:da:da:a0:10:85:17:92:05:
62:c1:89:f0:ff:5a:cd:f7:72:a8:e0:3d:f2:ad:c7:
44:64:88:72:40:84:53:fc:80:f9:5f:44:7b:bf:ce:
3c:93:87:05:af:d6:95:00:44:63:be:55:ac:25:8e:
25:3c:1c:2c:99:2d:d0:d0:72:da:f1:5f:a0:9b:4e:
56:20:10:4e:db:a7:cd:32:c8:32:48:cd:f9:bf:45:
8c:ca:b3:68:88:6d:61:fa:4c:80:87:0b:d6:f8:e6:
d9:73:5d:27:b7:bf:0f:35:81:89:93:ee:fa:84:15:
de:d4:99:45:d6:7a:fe:19:dc:71:56:29:00:6d:fb:
1b:1f:48:16:17:12:fe:0b:05:76:37:b7:f0:11:7a:
32:fb
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
X509v3 Certificate Policies:
Policy: 2.23.140.1.2.1
CPS: https://www.globalsign.com/repository/
X509v3 Subject Alternative Name:
DNS:*.lemonde.fr, DNS:lemonde.fr
X509v3 Basic Constraints:
CA:FALSE
X509v3 Extended Key Usage:
TLS Web Server Authentication, TLS Web Client Authentication
X509v3 CRL Distribution Points:
Full Name:
URI:http://crl.globalsign.com/gs/gsdomainvalg2.crl
Authority Information Access:
CA Issuers - URI:http://secure.globalsign.com/cacert/gsdomainvalg2.crt
OCSP - URI:http://ocsp2.globalsign.com/gsdomainvalg2
X509v3 Subject Key Identifier:
49:7C:AB:DD:45:95:AB:8C:15:8E:9A:E2:0E:FE:79:39:FF:5C:A6:3C
X509v3 Authority Key Identifier:
keyid:96:AD:FA:B0:5B:B9:83:64:2A:76:C2:1C:8A:69:DA:42:DC:FE:FD:28
Signature Algorithm: sha1WithRSAEncryption
33:65:d5:4d:39:4d:c9:86:52:bf:0f:d0:85:28:50:36:21:ac:
1d:f4:b4:69:22:48:5b:6b:99:64:19:51:71:0e:fc:c9:ca:5e:
05:e2:fc:ff:b8:e1:50:b8:4d:1c:82:a6:06:3e:3b:85:d2:ab:
fe:1e:18:02:d3:c1:e6:54:f4:26:ce:20:af:a3:52:90:5c:a8:
bb:ad:a0:a9:29:30:50:bd:64:f3:1e:26:76:d7:5d:05:2e:9e:
57:f2:3a:2a:fe:49:30:74:76:9f:b2:95:07:47:de:9e:8f:74:
5d:97:62:45:2b:16:d3:ae:80:66:22:b7:3a:b4:34:f0:33:e2:
40:bf:3d:39:3d:64:3f:94:b4:d7:a9:c6:e3:ca:76:76:86:67:
58:82:e9:95:4a:c4:70:93:6f:bc:34:5e:a6:6d:93:05:ae:41:
ae:8a:ac:ef:c2:65:6c:8f:af:46:31:c1:98:ca:11:6c:56:87:
98:44:9d:8b:8a:29:03:a3:cf:c7:6c:d5:3c:29:9f:ba:ff:db:
2f:38:a6:be:29:3d:be:ec:01:dc:1f:6c:55:1d:7d:74:7e:f4:
74:18:5a:f3:ca:64:2b:1e:d7:82:36:2c:ee:08:a5:35:c2:54:
0b:b5:cc:8b:28:03:6e:1e:ad:b6:05:c3:01:67:34:59:db:8b:
d4:20:b8:cb
执行HTML GET(注意-ign\u eof
):
服务器仅支持SSLv3和TLSv1,并且仅支持密码DES-CBC3-SHA。此密码不包括在ruby版本使用的默认密码集中,如中所示。 这种设置很奇怪,因为据我所知,DES-CBC3-SHA(即DES3)被认为比密码集中的RC4-SHA更安全
我试图找到一种为mechanize对象设置密码的方法,但我对编写ruby知之甚少,而且在系统上只有一个旧版本的ruby。您可以尝试类似于
agent.agent.http.ciphers=['des-cbc3-sha']
的方法,或者询问一些ruby专家。对于ruby<2.5
您可以将密码添加到默认密码列表中:
OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:ciphers] += ':DES-CBC3-SHA'
然后:
在Windows7上安装以下版本的ruby/rubygems为我解决了这个问题
> ruby -v
ruby 2.2.3p173 (2015-08-18 revision 51636) [i386-mingw32]
> gem -v
2.6.6
我对ruby一无所知,但问题似乎是证书链验证问题 i、 e.openssl错误“验证错误:num=20:无法获取本地颁发者证书” 是你失败的原因 失败的原因是整个链条无法加载。i、 e.缺少一个或多个证书 第一点是服务器提供的证书链缺少中间层。这确实是一个web服务器设置问题,因为他们在web服务器设置中缺少证书 您可以通过在本地CA文件中提供此中介来解决此问题。这很可能是它在您的另一台机器上工作的原因,因为该机器的CA文件包含和您的CA文件中的证书 我会检查您的CA文件(/etc/ssl/certs/CA certificates.crt)中是否有这两个证书,如果没有,则添加它们。一旦openssl命令在没有“verify error:num=20:cannot to get local issuer certificate”(验证错误:num=20:无法获取本地颁发者证书)错误的情况下工作,那么就可以排除rudy代码的问题(假设您的rudy代码使用相同的ca文件)
如果可以更新web服务器以使用包含服务器证书和证书的证书链文件,那么也应该可以解决该问题。
OpenSSL::SSL::VERIFY\u NONE
-坏主意。它可能由于SSLv3支持不匹配而失败(应该在任何地方禁用SSLv3)。请发布用于连接服务器的确切URL,并发布openssl s_客户端-connect:-tls1-servername | openssl x509-text-noout
的输出。通过单击“编辑”将其添加到问题中(不要将其作为评论发布)。否则,没有足够的信息帮助进行故障排除。如果这是windows机器,我建议使用认证的gem。它完美地处理了这个问题。该服务器只支持被拒绝的SSL v3。这是一个配置错误的服务器,需要先修复,然后才能正常工作。大多数客户端会自动忽略SSL作为有效方法,并坚持使用TLS 1.1或更高版本。您可以查看出了什么问题。@jww谢谢,已更新。@tadman=>我没有访问那个远程服务器的权限。作为客户端,我希望我的应用程序能够访问该服务器,即使有任何错误。在这两者之间,我的代码在另一台机器上工作,但在我的机器上不工作,所以这肯定是一个配置问题。该url只是一个示例,我的应用程序可能会访问任何其他出现相同问题的url,这就是为什么即使远程服务器配置错误,我也需要访问它。谢谢您的回答。我把日志放在问题里。但这无助于我理解。我仍在进行故障排除。根据我的日志,我可以访问该资源。但不使用我自己的应用程序(使用ruby)。我想我的应用程序使用的是不兼容的开放ssl库。谢谢你的回答。我也没有发现如何改变它。我现在使用的是一个较旧的ruby版本,它可以正常工作(我以前以为没有)。我暂时就这么做。我会让这个问题公开,直到有人找到答案,或者如果无法确定答案,我会接受你的答案:)
> ruby -v
ruby 2.2.3p173 (2015-08-18 revision 51636) [i386-mingw32]
> gem -v
2.6.6