我有一个在 centos 6 上运行良好的 bash 脚本,其中有一个 lwp-request 。我将系统升级到Centos 7,请求无法运行:
# lwp-request -E https://localhost/admin/startup
GET https://localhost/admin/startup
User-Agent: lwp-request/6.03 libwww-perl/6.05
500 Can't connect to localhost:443
Content-Type: text/plain
Client-Date: Sun, 25 Jan 2015 10:24:22 GMT
Client-Warning: Internal response
Can't connect to localhost:443
我验证了该网址可以通过浏览器访问。
我的假设是这是一个 perl-libraries-update 问题。
使用 lwp-request 的 SSL/TLS 网络需要哪些 perl 库?
或者这些库中发生了什么变化:
perl-libwww-perl
perl-Crypt-SSLeay
注意
在 Centos 7 中,我安装了这些(以及更多)新库,它们可能与此相关:
perl-Net-SSLeay
perl-IO-Socket-SSL
答案1
IO::Socket::SSL 验证证书中的名称是否与您连接到的名称匹配,但 Crypt::SSLeay 则不然。默认情况下,较新的 LWP 也会验证证书链,但也许您使用的旧 LWP 版本也可以这样做。
我建议您使用 SSL 调试来调用您的程序,以查看问题的实际原因:
perl -MIO::Socket::SSL=debug4 program.pl
然后您可以控制ssl_opts
应执行哪些检查,请参阅perldoc IO::Socket::SSL
有关选项的更多详细信息:
SSL_ca_file
如果您使用自签名证书或该证书不是由任何普遍信任的根 CA 颁发的,请使用。- 用于
SSL_verifycn_name
设置证书中应包含的名称。也就是说,如果您www.example.com
在证书中有一个名称,但连接到localhost
您应该设置的主机SSL_verifycn_name => 'www.example.com'
- 或者,您可以
SSL_fingerprint
仅检查证书的指纹并禁用任何其他检查。 - 最后,您可以使用 禁用任何类型的验证
SSL_verify_mode
。但这只是一种解决方法,您永远不应该在生产代码中执行此操作,因为这会使您容易遭受中间人攻击。
由于您无法直接设置 ssl_optslwp-request
我建议使用一个小程序,即如下所示:
use LWP::UserAgent;
my $ua = LWP::UserAgent->new( ssl_opts => {
SSL_ca_file => 'myca.pem',
SSL_verifycn_name => 'www.example.com',
});
print $ua->get('https://...')->as_string;