在Ubuntu 12.04上为Perl 5.14.2 LWP安装新的ca证书

时间:2013-10-15 19:21:27

标签: perl ssl ubuntu-12.04 lwp

尝试使用LWP连接到特定的https网站时出现以下错误:

LWP::Protocol::https::Socket: SSL connect attempt failed with unknown errorerror:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed at /usr/local/share/perl/5.14.2/LWP/Protocol/http.pm line 51.

我尝试了wget并得到了:

ERROR: cannot verify [domain]'s certificate, issued by `/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./OU=http://certificates.godaddy.com/repository/CN=Go Daddy Secure Certification Authority/serialNumber=********':
  Unable to locally verify the issuer's authority.

我google了一下,发现我可能不得不安装godaddy root ca cert。我想出了如何做到这一点(下载证书,放入/ usr / share / ca-certificates并运行update-ca-certificates)。我还学习了如何在这个过程中使用openssl s_client。

既然已经安装了证书,wget仍然有效,但是LWP仍然失败并出现相同的错误,openssl s_client也是如此:

# openssl s_client -connect [domain]:443
CONNECTED(00000003)
depth=0 O = [domain], OU = Domain Control Validated, CN = [domain]
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 O = [domain], OU = Domain Control Validated, CN = [domain]
verify error:num=27:certificate not trusted
verify return:1
depth=0 O = [domain], OU = Domain Control Validated, CN = [domain]
verify error:num=21:unable to verify the first certificate
verify return:1

我不知道下一步该去做什么。有什么建议吗?


编辑: 已解决这是一个简单的脚本,描述了mikew建议后的工作原理:

#!/usr/bin/perl
use LWP::UserAgent;
$URL="[domain]";
my $ua = LWP::UserAgent->new(ssl_opts => { SSL_ca_path=>'/etc/ssl/certs'});
my $response = $ua->get($URL);

1 个答案:

答案 0 :(得分:8)

要获得更具体的答案,我们需要知道如何实例化LWP对象。

但您可能需要了解的是LWP构造函数中SSL_ca_file的{​​{1}}和SSL_ca_path选项。如果没有这些设置,它会假定Mozilla_CA是用于验证网站的CA.

参见LWP::Protocol::https 以及LWP::UserAgentssl_opts构造函数选项。

如果您使用的是lwp-download之类的东西,而不是自己实际实例化LWP :: UserAgent对象,那么您需要将ssl_opts环境变量设置为指向您的证书颁发机构或设置PERL_LWP_SSL_CA_FILE到你的CA路径。你可以设置这些,而不是传入PERL_LWP_SSL_CA_PATH

如果您并不特别担心执行所有此类验证并喜欢危险地生活,则可以为ssl_opts设置verify_hostname => 0或将ssl_opts环境变量设置为0.

正如文档中所述,LWP 5.837及更早版本默认情况下关闭PERL_LWP_VERIFY_HOSTNAME,而后期版本默认为关闭