请帮我使用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. 

现在,这些都是正在点我很难找到问题:

  1. 这不是网络相关 - 如果我从任何浏览器访问相同的URL,我会得到页面。

  2. 如果我在包含我的Perl安装的精确副本的远程计算机上尝试相同的代码,它可以工作。

  3. 如果我在use Net::SSL之前WWW::Mechanize,它需要非常长的时间,但最终得到的页面。

  4. 如果我尝试任何其他SSL页面,如'https://www.paypal.com',它的工作原理和速度非常快。

  5. 然后,它再次在它们的定期维护之前工作。

我不确定还有什么可以尝试的。如果我切换到非SSL版本,它可以工作,但我不想这样做,因为我们自动采购操作。

随着已经越过我的脑海,想着为什么它在远程机器上,为什么我可以在当地的一个在我的浏览器打开网页很多事情:

是否有可能封闭让我的SSL公钥?那可能吗?如果是这样,那么LWP/Mechanize用于SSL会话的公钥是什么,以及如何使用不同的公钥?

预先感谢任何有帮助的评论。

+0

SSL没有公钥;我认为你用SSH来混淆它。如果直接从命令行执行SSL连接('openssl s_client -connect www.imstores.com:443'),您是否也遇到同样的问题?这可能会给你一些信息。 –

+0

你确定你没有被网络服务器阻止吗? – AnFi

+0

(1)可能不正确。您的浏览器可能正在使用代理。 – ikegami

下面是问题的实际原因:您需要使用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留给学生练习。

+0

令人惊叹,非常感谢!我在WWW :: Mechanize的构造函数中指定了'ssl_opts => {SSL_version =>'SSLv3'}',并且它再次运行得非常漂亮。真的,谢谢你花时间回答这个问题! :-) –

+0

不客气,调试SSL是我的一个爱好:-) –