跳到主要内容
ecdsa.com
OpenSSL 3OpenSSL CLI

错误信息

error:05800074:x509 certificate routines::key values mismatch

也可能输出为

  • x509 certificate routines:ossl_x509_check_private_key:key values mismatch
  • [X509: KEY_VALUES_MISMATCH] key values mismatch
  • code: 'ERR_OSSL_X509_KEY_VALUES_MISMATCH'

nginx -t 报告为“[emerg] SSL_CTX_use_PrivateKey(\"<key file>\") failed (SSL: error:05800074:x509 certificate routines::key values mismatch)”;openssl CLI 会加上函数名(“x509 certificate routines:ossl_x509_check_private_key:key values mismatch”);Python 输出“[X509: KEY_VALUES_MISMATCH] key values mismatch”;Node.js 设置的代码为 ERR_OSSL_X509_KEY_VALUES_MISMATCH。OpenSSL 1.1.1 使用的代码是 0B080074。

OpenSSL 3 — X509_R_KEY_VALUES_MISMATCH when loading a certificate with a private key (nginx, Node.js, Python, openssl s_server)

含义

TLS 服务器(或库)拿到的证书和私钥不属于同一对:证书中的公钥并不是这把私钥对应的公钥。OpenSSL 拒绝加载这一对文件,因此服务器无法启动,或者无法创建上下文。单看任何一个文件,都没有问题。

原因

修复方法

  1. 1.

    比较公钥

    分别对从证书中提取的公钥和从私钥派生出的公钥计算哈希;哈希相同就说明它们属于同一对。这种方法同样适用于 RSA、EC 和 Ed25519 密钥。

    bash
    # The two hashes must be identical
    openssl x509 -in server.pem -noout -pubkey | openssl sha256
    openssl pkey -in server.key -pubout | openssl sha256
  2. 2.

    把叶子证书放在证书包的最前面

    列出证书包中各证书的主体;对应你主机名的叶子证书必须排在最前面,后面跟着中间证书。

    bash
    # Servers match the key against the FIRST certificate of the file: make it the leaf
    openssl crl2pkcs7 -nocrl -certfile fullchain.pem | openssl pkcs7 -print_certs -noout | grep subject=
    cat api.example.com.crt intermediate.crt > fullchain.pem
  3. 3.

    从多把密钥中找出匹配的那把

    把证书公钥的哈希与每个候选密钥逐一比较;如果都不匹配,说明密钥已经丢失,必须用新密钥重新签发证书。

    bash
    # Which of several keys belongs to the certificate?
    cert=$(openssl x509 -in server.pem -noout -pubkey | openssl sha256)
    for k in /etc/ssl/private/*.key; do
      [ "$(openssl pkey -in "$k" -pubout 2>/dev/null | openssl sha256)" = "$cert" ] && echo "match: $k"
    done

相关错误

浏览完整的签名错误库