9

尝试使用 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.

我四处搜索,发现我可能必须安装 godaddy root ca 证书。我想出了如何做到这一点(下载证书,放入 /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);
4

1 回答 1

8

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

但是您可能需要了解的是LWP 构造函数中的SSL_ca_fileandSSL_ca_path选项。ssl_opts如果没有这些集合之一,它假定 Mozilla_CA 是用于验证网站的 CA。

请参阅LWP::Protocol::httpsLWP::UserAgentssl_opts构造函数选项。

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

如果您不是特别担心进行所有这些验证并且喜欢危险地生活,您可以将环境变量设置verify_hostname => 0ssl_opts或设置为 0。PERL_LWP_VERIFY_HOSTNAME

如文档中所述,LWP 5.837 及更早verify_hostname版本默认关闭,而更高版本默认为开启

于 2013-10-16T01:56:28.620 回答