带有IO :: Socket :: SSL的SSL_ca_path不使用目录中的证书

时间:2016-07-22 15:12:43

标签: perl ssl verification lwp-useragent

我想使用 local $NET::HTTPS::SSL_SOCKET_CLASS = 'IO::Socket::SSL'; my $ua = LWP::UserAgent->new(ssl_opts => { SSL_ca_file => "/etc/pki/tls/certs/ca-bundle.crt", # SSL_ca_path => "/etc/pki/tls/certs/", }); ssl选项,因为它更可靠。问题是它不使用给定目录中的证书。

此代码有效:

SSL_ca_path

但使用SSL_ca_file代替 local $NET::HTTPS::SSL_SOCKET_CLASS = 'IO::Socket::SSL'; my $ua = LWP::UserAgent->new(ssl_opts => { # SSL_ca_file => "/etc/pki/tls/certs/ca-bundle.crt", SSL_ca_path => "/etc/pki/tls/certs/", }); 会破坏脚本。

不工作

*.pem

既不将证书重命名为/也不删除路径中的尾随id total group_id 1897 738 1 2489 716 2 2325 715 3 1788 702 2 1707 699 3 2400 688 3 2668 682 2 1373 666 1 1494 666 1 1564 660 1 2699 659 1 1307 648 4 1720 645 4 2176 644 1 1454 644 4 2385 639 3 1001 634 2 2099 634 4 1006 632 1 2587 630 3 1955 624 3 1827 624 4 2505 623 4 2062 621 3 1003 618 1 2286 615 4 2722 609 4 可以解决问题。

目录和文件的权限和所有者是相同的(770)

完整脚本:https://github.com/Benedikt1992/nagios-jenkins-plugin/blob/master/check_jenkins_job_extended.pl#L71-L75

1 个答案:

答案 0 :(得分:5)

与OpenSSL一起使用的证书目录(IO :: Socket :: SSL使用的TLS实现)需要具有特定的结构,其中文件名基于证书主题的哈希值。这意味着仅仅删除目录中的证书是不够的。

例如,您将找到以下结构(取自Ubuntu /etc/ssl/certs):

lrwxrwxrwx 1 root root     41 Feb 25 10:19 f30dd6ad.0 -> USERTrust_ECC_Certification_Authority.pem
lrwxrwxrwx 1 root root     34 Feb 25 10:19 f3377b1b.0 -> Security_Communication_Root_CA.pem

可以使用OpenSSL rehash or c_rehash命令创建此目录结构。该命令创建以哈希开头的符号链接(在某些版本的OpenSSL中,可以使用openssl x509 -noout -hash -in <certfile>计算),然后是句号和数字(以.0开头),并使用{{1如果多个证书具有相同的哈希值,则为{},.1.2等。 注意:对于不同版本的OpenSSL,名称哈希的计算可能会有所不同。