为什么openssl s_client会根据不匹配的CAfile验证证书?

Modified on: Sat, 30 Jun 2018 06:54:00 +0800

我试图通过openssl s_client产生证书验证错误,如下所示:

$ openssl s_client -crlf -verify 9 \
  -CAfile /etc/ssl/certs/TURKTRUST_Certificate_Services_Provider_Root_1.pem \
  -starttls smtp -host mx-ha03.web.de -port 25

web.de服务器的证书由Deutsche Telekom CA认证,而不是TURKTRUST,因此上述命令应该失败,对吗?

但它报告说:

    Verify return code: 0 (ok)

为什么?

我的意思是模拟gnutls-cli命令按预期失败:

$ { echo -e 'ehlo example.org\nstarttls' ; sleep 1 } | \
   gnutls-cli --starttls --crlf \
   --x509cafile /etc/ssl/certs/TURKTRUST_Certificate_Services_Provider_Root_1.pem \
   --port 25 mx-ha03.web.de
[..]
*** Verifying server certificate failed...

进行交叉检查,即使用gnutls-cli代替--x509cafile /etc/ssl/certs/ca-certificates.crt

[..] - The hostname in the certificate matches 'mx-ha03.web.de'. - Peer's certificate is trusted

(也是预期的)

为ca-certificates.crt打印Openssl s_client:

[..]
- The hostname in the certificate matches 'mx-ha03.web.de'.
- Peer's certificate is trusted

与TURKTRUST相同的结果......

首先我怀疑openssl使用-CApath的默认设置(即/ etc / ssl / certs) - 但是当我strace时,我只看到open系统调用,用于CAfile的参数。

(在Ubuntu 10.04服务器上完成的所有测试)

更新:我已将TURKTRUST证书复制到Fedora 20系统并执行了第一个openssl语句 - 我得到了不同的结果:

    Verify return code: 0 (ok)
作者:,maxschlepzig

最佳答案

事实证明,Ubuntu 10.04上的openssl s_client仍会查询系统安装证书的默认位置,即使-CApath -CAfile被指定:

8466  open("/usr/lib/ssl/certs/4e18c148.0", O_RDONLY) = 4

(strace输出)

其中:

$ ls -l /usr/lib/ssl/certs/4e18c148.0
lrwxrwxrwx 1 root root 30 2014-04-11 21:50 /usr/lib/ssl/certs/4e18c148.0 ->
    Deutsche_Telekom_Root_CA_2.pem

目录/usr/lib/ssl/certs是Ubuntu 10.04上/etc/ssl/certs的符号链接,因此open时,未选择strace日志中的行

来源

查看openssl-0.9.8k,此问题的来源位于crypto/x509/by_dir.cdir_ctrl()

dir=(char *)Getenv(X509_get_default_cert_dir_env());
if (dir)
    ret=add_cert_dir(ld,dir,X509_FILETYPE_PEM);
else
    ret=add_cert_dir(ld,X509_get_default_cert_dir(),
                     X509_FILETYPE_PEM);

X509_get_default_cert_dir返回/usr/lib/ssl/certsX509_get_default_cert_dir_env返回SSL_CERT_DIR

解决方法

因此,可以在Ubuntu 10.04 / openssl 0.9.8k下使用以下解决方法来获得预期的行为:

$ SSL_CERT_DIR="" openssl s_client -crlf -verify 9 \
    -CAfile /etc/ssl/certs/TURKTRUST_Certificate_Services_Provider_Root_1.crt \
    -starttls smtp -host mx-ha03.web.de -port 25

验证失败:

Verify return code: 19 (self signed certificate in certificate chain)

现状

幸运的是,使用openssl 1.0.1e(例如在Fedora 20下),此解决方法不是必需的,因为问题已修复。这意味着在指定-CAfile-CApath等选项时,不会将默认证书系统目录添加到目录搜索列表中。

作者:,maxschlepzig

相关问答

添加新评论