我的 Linux 盒子在 /etc/pki/tls/certs/ca-bundle.crt 中有证书
我已经安装了 miniconda 并尝试使用它的 urllib.request 包。
import urllib.request
r = urllib.request("https://example.com")
根据 openssl 文档,如果我将 SSL_CERT_DIR 设置为“/etc/pki/tls/certs”,则 openssl 应选择 ca-bundle.crt 文件。 但我得到了错误 [SSL:证书验证失败]。
当我将变量 SSL_CERT_FILE 设置为“/etc/pki/tls/certs/ca-bundle.crt”时,一切正常。
为什么设置 SSl_CERT_DIR 不起作用?根据文档,它应该可以工作。
您对 SSL_CERT_DIR 环境变量的理解是正确的。变量中指定的目录适用于受信任的根证书(但不适用于中间证书!)。
将根证书复制到此目录时,它们必须遵循特定的命名约定。证书应为常规PEM格式,但文件名必须命名
[HASH].0
其中 [HASH] 是证书主题的哈希值。您可以通过以下命令找到该哈希值(将 root.cer 替换为您的根证书的文件名)
openssl x509 -subject_hash -in root.cer
免责声明:我在 Windows 机器上使用为 Windows 编译的 openssl 进行了测试。我不必像 openssl verify 的手册页中提到的那样创建符号链接。
因为你需要运行
c_rehash
让 openssl
知道在哪里可以找到该文件:
SSL_CERT_DIR=$(pwd) c_rehash
SSL_CERT_DIR=$(pwd) openssl s_client -verify_return_error -connect localhost:443 < /dev/null