Fra*_*ozo 4 perl ssl www-mechanize lwp-useragent
我正在使用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;
Run Code Online (Sandbox Code Playgroud)
代码消失(大约60秒后),并显示以下消息:
Error GETing https://www.imstores.com/Ingrammicromx/login/login.aspx:
Can't connect to www.imstores.com:443 at test.pl line 7.
Run Code Online (Sandbox Code Playgroud)
现在,这些是让我很难找到问题的要点:
它与网络无关 - 如果我从任何浏览器访问相同的URL,我都会获得该页面.
如果我在包含我的Perl安装的精确副本的远程计算机上尝试相同的代码,它可以工作.
如果我use Net::SSL之前WWW::Mechanize,它需要很长时间,但最终得到页面.
如果我尝试任何其他SSL页面,例如" https://www.paypal.com ",它的工作速度非常快.
然后,它再次在他们的计划维护之前工作.
我不知道还有什么可以尝试的.如果我切换到非SSL版本,它可以工作,但我不想这样做,因为我们自动化采购操作.
除了我想到的许多事情,想一想为什么它在远程机器上工作以及为什么我可以在我的浏览器中打开本地的页面:
是否可能被我的SSL公钥阻止?那可能吗?如果是这样,LWP/Mechanize用于SSL会话的公钥是什么?如何使用不同的公钥?
我当前设置的一些数据:
LWP::UserAgent 版本:6.05WWW::Mechanize 版本:1.72IO::Socket 版本:1.34IO::Socket::SSL 版本:1.85Net::SSL 版本:2.85Crypt::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
---
Run Code Online (Sandbox Code Playgroud)
但是当我连接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...]
Run Code Online (Sandbox Code Playgroud)
究竟如何制作WWW:机械化使用TLS1或SSLv3留给学生练习.