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

Pet*_*ikh 1 ubuntu openssl curl ssl-certificate-errors

我必须使用使用自签名证书(来自 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
Run Code Online (Sandbox Code Playgroud)

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

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

ecd*_*dsa 6

在撰写本文时,example.net使用了由DigiCert SHA2 Secure Server CA中间 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)。可能有一个设置称为CipherSuites设置SECLEVEL(例如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
Run Code Online (Sandbox Code Playgroud)

它可以与例如一起使用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
Run Code Online (Sandbox Code Playgroud)

  • `curl --ciphers DEFAULT:@SECLEVEL=$n ...` 在不修改配置的情况下进行设置(这可能会影响其他程序或用户(如果有) (2认同)