我正在使用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;
代码在大约60秒后死亡,并显示以下消息:
Error GETing https://www.imstores.com/Ingrammicromx/login/login.aspx:
Can't connect to www.imstores.com:443 at test.pl line 7.
现在,这些是让我很难找到问题的要点:
这与网络无关 - 如果我从任何浏览器访问相同的网址,我都会看到此页面。
如果我在包含Perl安装的精确副本的远程计算机上尝试相同的代码,则可以正常运行。
如果我在use Net::SSL
之前WWW::Mechanize
,则需要很长时间,但最终会获得该页面。
如果我尝试任何其他SSL页面,例如“https://www.paypal.com”,它的工作速度非常快。
然后,它又在他们的预定维护之前工作。
我不确定还有什么可以尝试的。如果我切换到非SSL版本,它可以工作,但我不想这样做,因为我们自动化采购操作。
除了我想到的许多事情,想一想为什么它在远程计算机上工作以及为什么我可以在本地浏览器中打开页面:
是否可以使用我的SSL公钥阻止?那可能吗?如果是这样,LWP / Mechanize用于SSL会话的公钥是什么?如何使用不同的公钥?
我当前设置的一些数据:
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 提前感谢任何有用的评论。
答案 0 :(得分:9)
以下是问题的实际原因:您需要使用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留给学生练习。