如何诊断“CA 证书太弱”错误,如何使用 CA 证书?

如何诊断“CA 证书太弱”错误,如何使用 CA 证书?

我必须使用使用自签名证书(来自 Ubuntu)的服务。我已将公司的 CA 添加到受信任列表(Ubuntu)。之后,“链中的自签名证书”错误消失,但现在我收到“CA 证书太弱”错误。例如

curl -vvv https://someservicehost.net
 *   Trying 93.184.216.34:443...
 * TCP_NODELAY set
 * Connected to someservicehost.net (93.184.216.34) port 443 (#0)
 * ALPN, offering h2
 * ALPN, offering http/1.1
 * successfully set certificate verify locations:
 *   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
 * TLSv1.3 (OUT), TLS handshake, Client hello (1):
 * TLSv1.3 (IN), TLS handshake, Server hello (2):
 * TLSv1.2 (IN), TLS handshake, Certificate (11):
 * TLSv1.2 (OUT), TLS alert, bad certificate (554):
 * SSL certificate problem: CA certificate key too weak
 * Closing connection 0
curl: (60) SSL certificate problem: CA certificate key too weak

我尝试搜索,但令人惊讶的是,关于这方面的信息很少。所以我有两个问题

  • 我如何才能准确找到该证书的哪些属性使其“薄弱”?是哈希值、密钥长度还是其他什么?我故意省略了证书详细信息,因为我想知道如何诊断问题,而不是诊断该特定证书的问题。
  • 我如何强制客户端软件信任它?我想我没有选择升级 CA 证书。

答案1

在撰写本文时,example.net使用了由中间 CA 签名的证书DigiCert SHA2 Secure Server CA,该证书又由DigiCert Global Root CA根 CA 签名。两个 CA 证书都使用2048 位 RSA密钥。但是,如果您使用的是企业 TLS 代理,实际的 CA 可能只使用 1024 位密钥(您没有提供任何详细信息),因此请根据该 CA 证书的密钥大小调整其余答案。如果您无法避免使用代理,那么比下面描述的方法更好的方法是询问是否可以在其上使用具有更强密钥的 CA 证书。

当 OpenSSL 验证证书链时,它会根据配置的安全级别。 根据文档其中,级别 1 对应的安全性至少为 80 位,级别 2 对应的安全性至少为 112 位,级别 3 对应的安全性至少为 128 位,级别 4 对应的安全性至少为 192 位,级别 5 对应的安全性至少为 256 位。

目前,RSA 2048 位密钥被认为具有 112 位安全性,因此如果上述级别为 3 或更高,则密钥会因太弱而被拒绝。因此,要接受这样的证书,您必须将安全级别降低到 2 或更低。

级别可以在编译时或通过配置进行配置(也可以通过链接 libssl/libcrypto 的程序进行更改,但 curl 似乎不会这样做)。根据上面链接的文档,默认级别为 1。

因此,首先检查编译选项(openssl version -f),然后检查openssl.cnf系统上的默认文件(可以通过确定其所在的目录openssl version -d)。可能有一个名为的设置CipherSuitesSECLEVEL例如CipherString = DEFAULT@SECLEVEL=3将其设置为级别 3)。

要覆盖级别,请更改默认配置文件,或通过OPENSSL_CONF环境变量使用自定义文件。例如,以下文件将默认安全级别设置为 2(请参阅文档详情请见):

openssl_conf = openssl_conf_sect

[openssl_conf_sect]
ssl_conf = ssl_sect

[ssl_sect]
system_default = system_default_sect

[system_default_sect]
CipherString = DEFAULT@SECLEVEL=2

例如它可以与一起使用OPENSSL_CONF=/path/to/this.cnf curl -vvv https://example.net

正如@dave_thompson_085 在评论中指出的那样,curl允许在命令行上配置密码套件。因此,您无需摆弄配置,只需通过--ciphers以下选项更改安全级别即可:

curl -vvv --ciphers DEFAULT@SECLEVEL=2 https://example.net

相关内容