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

SSL_ca_path with IO::Socket::SSL doesn't use certs in directory

我想使用 SSL_ca_path ssl 选项,因为它更可靠。它不使用给定目录中的证书的问题。

此代码有效:

  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_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 或删除路径中尾随的 / 都无法解决问题。

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

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

与 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.2.3 等(如果多个证书具有相同的哈希值)。 注意:对于不同版本的 OpenSSL,名称的哈希计算可能不同。