WWW::Mechanize
将产品目录中的目录加载到我们的数据库中.我每天每2小时运行一次这个脚本,它通过使用大约50个同步线程在大约12分钟内完成.
一切都很顺利,直到这个周末.他们让他们的网站离线进行定期维护,一旦他们再次在线,我的脚本就不再有用了.在分析了一些事情后,它归结为以下代码失败:
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;
Error GETing https://www.imstores.com/Ingrammicromx/login/login.aspx: Can't connect to www.imstores.com:443 at test.pl line 7.
现在,这些是让我很难找到问题的要点:
>这与网络无关 – 如果我从任何浏览器访问相同的网址,我都会收到该页面.
>如果我在包含Perl安装的精确副本的远程计算机上尝试相同的代码,则可以正常工作.
>如果我在WWW :: Mechanize之前使用Net :: SSL,则需要很长时间,但最终会获得该页面.
>如果我尝试任何其他SSL页面,例如’https://www.paypal.com‘,它的工作速度非常快.
>然后,它再次在他们的预定维护之前工作.
我不知道还有什么可以尝试的.如果我切换到非SSL版本,它可以工作,但我不想这样做,因为我们自动化采购操作.
除了我想到的许多事情,想一想为什么它在远程机器上工作以及为什么我可以在我的浏览器中打开本地的页面:
是否可能被我的SSL公钥阻止?那可能吗?如果是这样,LWP / Mechanize用于SSL会话的公钥是什么?如何使用不同的公钥?
我当前设置的一些数据:
>操作系统:Windows 7旗舰版x64
> Perl版本:5.16.3 x64
> 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
在此先感谢任何有用的评论.
解决方法
这就是我发现它的方式:
我尝试从几个不同的服务器连接,我发现那些工作的服务器有一个较旧的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留给学生练习.