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


99

我无法设置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,并且指令指向正确的私钥和证书。

我还检查了模数,并且密钥和证书的模数也不同。

谢谢您的帮助。:)

Answers:


36

我得到了MD5哈希,其密钥和证书的结果不同。

这说明了一切。您的密钥和证书不匹配。

模数应匹配。确保您具有正确的密钥。


除非我缺少任何内容,否则您绝对希望公用密钥和专用密钥(证书文件和密钥文件)有所不同。
Mark Berry

1
modulus' and the 密钥和证书中的公共指数部分必须匹配。毫无疑问,文件是不同的。密钥是为一个特定证书生成的。
dev0z

我的错。我以为他指的是文件的MD5。现在,我看到证书具有单独的模数功能: 在安装之前,如何确认私钥中的模数与SSL / TLS证书公钥中的模数匹配?
马克·贝里

165

一旦确定它们不匹配,您仍然会有问题-怎么做。通常,证书可能只是错误地组装而成。当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

24
巨大的+1,用于显示如何查看证书链中的内容。
cbednarski 2015年

绝对有用,我花了一个小时试图理解为什么nginx拒绝了证书,而我却看到它包含了数据
Jacopofar 2015年

3
好的,这对于Comodo证书和Ngix也对我有用。刚刚将最后一个证书块推到顶部。感谢您对此问题的详细解释和见解。
安迪D

1
它对我有帮助!非常有用的答案!非常感谢!
奥列格·克里姆缅科

70
  1. 确保您的证书和密钥为PEM格式。如果没有,则使用openssl命令转换
  2. 检查公钥的MD5哈希值,以确保它与私钥中的内容匹配

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

7
好建议 !好吧,即使md5哈希值对我来说都是一样的,仍然会收到相同的错误^^
Delphine

4
感谢您包括如何验证哈希。我发现我有一个复制粘贴错误,并且在我的Pem开头缺少一个破折号。您为我省了很多麻烦。干杯。
贾斯汀·佛捷

38

我遇到了这个问题,因为我以错误的顺序添加了捆绑包和证书,所以也许这可以帮助其他人。

之前(这是错误的):

cat ca_bundle.crt certificate.crt > bundle_chained.crt

之后(正确)

cat certificate.crt ca_bundle.crt > bundle_chained.crt

并且请不要忘记更新适当的conf(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手册页

如果服务器证书和分发包的连接顺序错误,nginx将无法启动并显示错误消息:

SSL_CTX_use_PrivateKey_file(" ... /www.example.com.key") failed
   (SSL: error:0B080074:x509 certificate routines:
    X509_check_private_key:key values mismatch)

3
实际上,与已接受的问题相比,对这个问题的回答更好。
baldrs

9

如果发生这种情况,并且您正在使用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文档“我的证书在哪里?”


或捆绑软件中证书的顺序错误:首先是letencrypt,然后是自己的证书。
ingopingo

5

我遇到了同样的问题,最后通过更改证书文件中的pem块的顺序解决了该问题。

cert块应放在文件的开头,然后是中间块,然后是根块。

我通过将有问题的证书文件与有效的证书文件进行比较来实现此问题。


1

我在这个问题上的5美分:

我有同样的问题。大约1个小时的照顾之后,我发现我粘贴了证书错误。

如果您有这样的错误,请检查您的证书。


1

在我的情况下,我想更改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,它就可以了。


0

当您的CA发行中间证书时,也会发生这种情况

我使用nginx遇到了这个问题(两次),这篇文章中没有任何解决方案可以解释这个问题。一位名叫马可(Marco)的绅士在此发表的博客文章把它钉牢了,我在这里粘贴给任何也遇到我所看到的东西的人。https://medium.com/@mrkdsgn/steps-to-install-a-go-daddy-ssl-certificate-on-nginx-on-ubuntu-14-04-ff942b9fd7ff

在我的情况下,godaddy是CA,这特定于他们如何发行证书和中间证书捆绑包。

这是Marco博客文章的摘录

使用Nginx,如果您的CA包括中间证书,则必须创建一个包含您的证书和CA的中间证书的单链证书文件。

您可以使用以下命令来创建一个名为example.com.chained.crt的组合文件:

cat example.com.crt intermediate.crt > example.com.chained.crt


0

在我的情况下,问题是我创建了证书而没有在cli界面中输入任何数据。当我重新生成证书并迷恋所有领域时:城市,州等一切都变好了。

 sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt

0

当我将bundle.crt和main证书合并在一起时,这发生了。原因是我将主要证书复制到bundle.crt下面。应该是相反的方式

1 /主证书2 / bundle.crt


0

对于Nginx:

  1. openssl req -newkey rsa:2048 -nodes -keyout domain.com.key -out domain.com.csr

  2. SSL文件domain_com.crt和其他domain_com.ca-bundle文件,然后将新文件复制并粘贴domain.com.chained.crt

3:添加nginx文件:

  1. ssl_certificate /home/user/domain_ssl/domain.com.chained.crt;
  2. ssl_certificate_key /home/user/domain_ssl/domain.com.key;

延迟重新启动Nginx。


0

SL_CTX_use_PrivateKey(“ / etc / nginx / ssl / file”)失败(SSL:错误:0B080074:x509证书例程:X509_check_private_key:键值不匹配)

当证书私钥(ssl_certificate_key例如,.key.pem文件)与ssl_certificate您的Nginx配置(选中nginx.conf或中的sites-enabled/)中的公共证书文件()不匹配时,可能会发生此错误。确保两个文件都匹配。

检查Nginx错误日志以获取更多详细信息(例如/var/log/nginx/error.log)。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.