请帮我使用WWW :: Mechanize(或LWP :: UserAgent为此事)调试SSL问题
我使用WWW::Mechanize
从我们的产品提供者加载目录到我们的数据库。我每天每2小时运行一次该脚本,并在大约12分钟内完成大约50个并发线程。请帮我使用WWW :: Mechanize(或LWP :: UserAgent为此事)调试SSL问题
一切都很完美,直到本周末。他们把他们的网站离线进行定期维护,一旦他们再次上网,我的脚本就不再工作了。分析的东西后,把它归结为以下代码失败:
use strict;
use warnings;
use WWW::Mechanize;
my $mec = WWW::Mechanize->new;
$mec->get('https://www.imstores.com/Ingrammicromx/login/login.aspx');
print $mec->content;
代码死亡(约60秒后)以下消息:
Error GETing https://www.imstores.com/Ingrammicromx/login/login.aspx:
Can't connect to www.imstores.com:443 at test.pl line 7.
现在,这些都是正在点我很难找到问题:
这不是网络相关 - 如果我从任何浏览器访问相同的URL,我会得到页面。
如果我在包含我的Perl安装的精确副本的远程计算机上尝试相同的代码,它可以工作。
如果我在
use Net::SSL
之前WWW::Mechanize
,它需要非常长的时间,但最终得到的页面。如果我尝试任何其他SSL页面,如'https://www.paypal.com',它的工作原理和速度非常快。
然后,它再次在它们的定期维护之前工作。
我不确定还有什么可以尝试的。如果我切换到非SSL版本,它可以工作,但我不想这样做,因为我们自动采购操作。
随着已经越过我的脑海,想着为什么它在远程机器上,为什么我可以在当地的一个在我的浏览器打开网页很多事情:
是否有可能封闭让我的SSL公钥?那可能吗?如果是这样,那么LWP/Mechanize用于SSL会话的公钥是什么,以及如何使用不同的公钥?
- 操作系统:Windows 7旗舰版64位
- Perl版本:5.16.3 64
-
LWP::UserAgent
版本:6.05 -
WWW::Mechanize
版本:1.72 -
在我的当前设置一些数据
IO::Socket
版本:1.34 -
IO::Socket::SSL
版本:1.85 -
Net::SSL
版本:2.85 -
Crypt::SSLeay
版本:0.64
预先感谢任何有帮助的评论。
下面是问题的实际原因:您需要使用SSLv3或TLS1而不是TLS1.2来连接到该服务器。这可能是你使用Net :: SSL之后的原因;我相信它会以WWW:Mechanize不会的方式尝试不同的密码。
这是我如何找到它:
我试着从几个不同的服务器连接,我发现那个工作的那些有一个旧版本的SSL。然后我检查了版本之间使用的密码之间的区别,并尝试使用不同的密码进行连接。
当我连接使用TLS1.2,我得到:
$ openssl s_client -connect www.imstores.com:443 -tls1_2
CONNECTED(00000003)
write:errno=54
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 322 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---
但是,当我用的SSLv3或TLS1连接,我得到:
$ openssl s_client -connect www.imstores.com:443 -tls1
CONNECTED(00000003)
depth=0 /serialNumber=O3gPUAuGGROuHEhlyLaeJfj7SOn6tFTx/C=US/O=www.imstores.com/OU=GT29846307/OU=See www.geotrust.com/resources/cps (c)11/OU=Domain Control Validated - QuickSSL(R) Premium/CN=www.imstores.com
verify error:num=20:unable to get local issuer certificate
[...and so on, including server certificate...]
究竟如何让WWW:机械化使用TLS1或SSLv3留给学生练习。
令人惊叹,非常感谢!我在WWW :: Mechanize的构造函数中指定了'ssl_opts => {SSL_version =>'SSLv3'}',并且它再次运行得非常漂亮。真的,谢谢你花时间回答这个问题! :-) –
不客气,调试SSL是我的一个爱好:-) –
SSL没有公钥;我认为你用SSH来混淆它。如果直接从命令行执行SSL连接('openssl s_client -connect www.imstores.com:443'),您是否也遇到同样的问题?这可能会给你一些信息。 –
你确定你没有被网络服务器阻止吗? – AnFi
(1)可能不正确。您的浏览器可能正在使用代理。 – ikegami