4

我正在使用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.

现在,这些是让我难以找到问题的要点:

  1. 它与网络无关——如果我从任何浏览器访问相同的 URL,我就会得到该页面。

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

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

  4. 如果我尝试任何其他 SSL 页面,例如“ https://www.paypal.com ”,它可以运行并且非常快。

  5. 再说一次,它在他们预定的维护之前就开始工作了。

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

除了我脑海中闪过的许多事情,思考为什么它可以在远程机器上运行以及为什么我可以在本地浏览器中打开页面:

是否有可能被我的 SSL 公钥阻止?那可能吗?如果是这样,LWP/Mechanize 用于 SSL 会话的公钥是什么,我如何使用不同的公钥?

我当前设置的一些数据:

提前感谢您提供任何有用的评论。

4

1 回答 1

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:Mechanize 使用 TLS1 或 SSLv3 作为练习留给学生。

于 2013-04-16T09:10:37.510 回答