SSL: 错误:0B080074:X509证书例程:X509_check_private_key:密钥值不匹配

177

我无法设置SSL。我已经在Google上搜索了几个解决方案,但没有一个适用于我。请帮帮我...

当我尝试重新启动nginx时,这是我得到的错误:

root@s17925268:~# service nginx restart
Restarting nginx: nginx: [emerg] SSL_CTX_use_PrivateKey_file("/etc/nginx/conf.d/ssl/ssl.key") failed (SSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch)
nginx: configuration file /etc/nginx/nginx.conf test failed

我的证书是由StartSSL颁发的,有效期为1年。

以下是我测试过的内容:

  • 证书和私钥没有尾随空格。
  • 我没有使用默认的server.key文件。
  • 我检查了nginx.conf文件,并且指令指向了正确的私钥和证书。

我还检查了模数,发现密钥和证书的模数不同。

感谢您的帮助。 :)

19个回答

246

一旦您确定它们不匹配,您仍然面临一个问题--该怎么办。通常,证书可能只是组装错误。当CA签署您的证书时,他们会向您发送一个类似于以下内容的块:

-----BEGIN CERTIFICATE-----
MIIAA-and-a-buncha-nonsense-that-is-your-certificate
-and-a-buncha-nonsense-that-is-your-certificate-and-
a-buncha-nonsense-that-is-your-certificate-and-a-bun
cha-nonsense-that-is-your-certificate-and-a-buncha-n
onsense-that-is-your-certificate-AA+
-----END CERTIFICATE-----

他们还会向您发送一组(通常是两个证书),代表他们授予您证书的权威。这将类似于

-----BEGIN CERTIFICATE-----
MIICC-this-is-the-certificate-that-signed-your-request
-this-is-the-certificate-that-signed-your-request-this
-is-the-certificate-that-signed-your-request-this-is-t
he-certificate-that-signed-your-request-this-is-the-ce
rtificate-that-signed-your-request-A
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICC-this-is-the-certificate-that-signed-for-that-one
-this-is-the-certificate-that-signed-for-that-one-this
-is-the-certificate-that-signed-for-that-one-this-is-t
he-certificate-that-signed-for-that-one-this-is-the-ce
rtificate-that-signed-for-that-one-this-is-the-certifi
cate-that-signed-for-that-one-AA
-----END CERTIFICATE-----

不幸的是,它们不会被如此清晰地标记。

常见的做法是将这些证书捆绑成一个文件——首先是您的证书,然后是签名证书。但由于它们不容易区分,有时候会发生有人无意中颠倒顺序——先是签名证书,然后是最终证书——而没有注意到。在这种情况下,您的证书将无法与您的密钥匹配。

您可以通过运行以下命令来测试证书认为它代表什么:

openssl x509 -noout -text -in yourcert.cert

在顶部附近,您应该看到“主题:”,然后是类似于您的数据的内容。如果看起来像您的CA,则可能是捆绑包的顺序错误;您可以尝试备份,然后将最后一个证书移到开头,希望那是您的证书。

如果这样做不起作用,您可能只需要重新颁发证书。当我制作CSR时,我喜欢清楚地标记它是为哪个服务器而制作(而不仅仅是ssl.key或server.key),并将其副本命名为日期,例如mydomain.20150306.key等。这样,私钥和公钥对不太可能与另一组混淆。


1
这对我在Nginx上解决了问题! - TTT
41
非常赞同您展示了如何查看证书链的方法。 - cbednarski
3
好的,对于我来说这也适用于使用 Comodo 证书和 Ngix。只需将最后一个 cert 块推到顶部即可。感谢详细的解释和对这个问题的洞察力。 - Andy D
@Amrendra:听起来你可能需要将你的pem、中间证书和根证书捆绑在一起。尝试创建一个包含每个文件内容的单个文件,按照顺序排列,例如cp pem bundle; cat intermediate >> bundle; cat root >> bundle。 - Vynce
1
这对我很有帮助!非常有用的答案!非常感谢你! - Oleg Klimenko
显示剩余8条评论

121
  1. 确保您的证书和密钥是PEM格式。如果不是,请使用openssl命令进行转换。
  2. 检查公钥的MD5哈希值,以确保它与私钥中的内容匹配

openssl x509 -noout -modulus -in certificate.crt | openssl md5
openssl rsa -noout -modulus -in privateKey.key | openssl md5

10
好建议!尽管对我来说MD5哈希值相同,但仍然出现相同的错误。^^ - Delphine
5
谢谢您提供了如何验证哈希值的方法。我发现我复制粘贴时出了错,我的pem文件开头缺少一个短横线。您为我省下了很多麻烦。谢谢。 - Justin Fortier
谢谢你,我还找到了一份有用的“openssl”命令速查表https://gist.github.com/Hakky54/b30418b25215ad7d18f978bc0b448d81 - Michael

100

我之前遇到了这个问题,因为我将Bundle和证书添加的顺序错误,也许这会帮助其他人。

错误的添加顺序如下:

cat ca_bundle.crt certificate.crt > bundle_chained.crt

之后(即是正确的)

cat certificate.crt ca_bundle.crt > bundle_chained.crt

请不要忘记更新适当的配置文件(ssl_certificate现在必须指向链接的crt)

server {
    listen              443 ssl;
    server_name         www.example.com;
    ssl_certificate     bundle_chained.crt;
    ssl_certificate_key www.example.com.key;
    ...
}

来自 nginx manpage:

如果服务器证书和绑定包的顺序拼接错误,nginx 将无法启动并显示以下错误信息:

SSL_CTX_use_PrivateKey_file(" ... /www.example.com.key") failed
   (SSL: error:0B080074:x509 certificate routines:
    X509_check_private_key:key values mismatch)
非常感谢您的信任。为了让我能够准确翻译,您需要将需要翻译的内容提供给我。

9
这实际上是对那个问题的一个比被接受的回答更好的答案。 - baldrs
3
太棒了!这正是问题所在。 - Rafael Pizao
1
这个!谢谢。 - Joris
1
将 certificate.crt 和 ca_bundle.crt 合并成 bundle_chained.crt,这个方法让我受益匪浅,我已经搜索了将近两天的时间才找到解决方案。 - Anup Yadav
1
这就是答案。谢谢! - Caterpillaraoz
显示剩余3条评论

52

我得到了一个MD5哈希值,密钥和证书结果不同。

这就说明了问题。您的密钥和证书不匹配。

模数应该匹配。请确保您拥有正确的密钥。


1
除非我漏了什么,否则您绝对希望公钥和私钥(证书文件和密钥文件)是不同的。 - Mark Berry
1
密钥和证书中的“模数”和“公共指数”部分必须匹配。毫无疑问,这些文件是不同的。该密钥是为一个特定的证书生成的。 - dev0z
我的错。我以为他是在提到文件的MD5。现在我明白了,证书有一个单独的模数函数:如何确认您的私钥中的模数与安装之前SSL/TLS证书的公钥中的模数匹配? - Mark Berry
注意:对于已经将证书与完整链合并的人,请注意,你的证书必须放在第一位,因为它会根据找到的第一个证书计算哈希值,如果不是你的证书,将无法正常工作。 - undefined

13
如果出现这种情况,而您正在使用Let's Encrypt / certbot,则原因很可能是您使用了chain.pem而不是fullchain.pem
应该是这样的:
ssl_certificate /etc/certbot/live/example.com/fullchain.pem;
ssl_certificate_key /etc/certbot/live/example.com/privkey.pem;

请查看Certbot文档中的“我的证书在哪里?”


证书包中的顺序可能有误:首先是Let's Encrypt证书,然后是自己的证书。 - ingopingo
我讨厌你:D为了解决问题找了一个小时。本以为我打了“fullchain”,但实际上我打成了“chain”。 - Stijn Leenknegt

8

我曾经遇到了同样的问题,最终通过改变证书文件中pem块的顺序解决了它。

证书块应该放在文件开头,然后是中间块,再是根块。

我通过比较有问题的证书文件和正常工作的证书文件意识到了这个问题。


4

在我的情况下,私钥文件末尾有一个换行符。

格式不正确:

-----END PRIVATE KEY-----

正确的格式:

-----END PRIVATE KEY-----

是的,命令顺序应为cat certificate.crt ca_bundle.crt > bundle_chained.crt,而ca_bundle.crt的第一行不应该和certificate.crt的最后一行在同一行。

错误格式:

-----END CERTIFICATE----------BEGIN CERTIFICATE-----

正确格式:

-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----

4

我在Nginx上遇到了同样的问题,但是以下方法帮助我解决了它。

我已经移除了bundle并使用crt文件进行了更新。

ssl_certificate /path/to/cert.crt;
ssl_certificate_key /path/to/key.key;

这个bundle并不是100%必要的,但它可以提高兼容性。


这对我有用,但我想知道你是否找到了使用bundle修复它的方法?非常感谢。 - Githendra McShane

2

关于这个问题,我的看法是:

我曾经也遇到过同样的问题。在大约花费了一个小时寻找后,我发现我把证书复制粘贴错误了。

如果你遇到类似的错误,请检查你的证书。


2
在我的情况下,我想要更改SSL证书,因为我已经更换了服务器,所以我需要用以下命令创建一个新的CSR:
 openssl req -new -newkey rsa:2048 -nodes -keyout mysite.key -out mysite.csr

我已经将mysite.csr文件发送给SSL服务提供商,并在收到证书crt后重启了nginx,但是出现了以下错误。
 (SSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch)

经过大量的调查,错误在于密钥文件中的模块与crt文件中的模块不一致。因此,为了使其工作,我创建了一个新的csr文件,但必须使用此命令更改文件名。
 openssl req -new -newkey rsa:2048 -nodes -keyout mysite_new.key -out mysite_new.csr

然后我从公司提供商那里收到了一个新的crt文件,重启nginx就可以运行了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接