SSL:错误:0B080074:x509 证书例程:X509_check_private_key:键值不匹配
Posted
技术标签:
【中文标题】SSL:错误:0B080074:x509 证书例程:X509_check_private_key:键值不匹配【英文标题】:SSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch 【发布时间】:2014-11-29 06:01:09 【问题描述】:我无法设置 SSL。我用谷歌搜索了一些解决方案,但没有一个对我有用。我需要一些帮助...
这是我尝试重新启动 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 和 指令指向正确的私钥和证书。我还检查了模数,我得到了密钥和证书的不同模数。
感谢您的帮助。 :)
【问题讨论】:
【参考方案1】:我在 Nginx 上遇到了同样的问题,但下面帮助我解决了它。
我已删除捆绑包并使用 crt 文件对其进行了更新。
ssl_certificate /path/to/cert.crt;
ssl_certificate_key /path/to/key.key;
捆绑包不是 100% 必需的,但它提高了兼容性。
【讨论】:
【参考方案2】:在我的情况下,我必须连接我的域的证书。
cat myDomain.crt EntityCertCA.crt TrustedRoot.crt > bundle.crt
并且在配置文件/etc/nginx/nginx.conf中
ssl_certificate "/etc/pki/nginx/bundle.crt";
重启服务,一切正常。
systemctl restart nginx.service
源步骤 2:https://www.namecheap.com/support/knowledgebase/article.aspx/9781/2238/nginx-ssl-error0b080074x509-certificate-routines-x509checkprivatekeykey-values-mismatch
【讨论】:
【参考方案3】:SL_CTX_use_PrivateKey("/etc/nginx/ssl/file") 失败(SSL:错误:0B080074:x509 证书例程:X509_check_private_key:key values mismatch)
当证书私钥(ssl_certificate_key
,例如.key
或.pem
文件)与您的Nginx 配置中的公共证书文件(ssl_certificate
)不匹配时,可能会发生此错误(检查nginx.conf
或在sites-enabled/
)。确保两个文件匹配。
查看 Nginx 错误日志以获取更多详细信息(例如 /var/log/nginx/error.log
)。
【讨论】:
【参考方案4】:对于 Nginx:
openssl req -newkey rsa:2048 -nodes -keyout domain.com.key -out domain.com.csr
SSL 文件 domain_com.crt
和 domain_com.ca-bundle
文件,然后将新文件复制到粘贴 domain.com.chained.crt
。
3:添加nginx文件:
ssl_certificate /home/user/domain_ssl/domain.com.chained.crt;
ssl_certificate_key /home/user/domain_ssl/domain.com.key;
后期重启 Nginx。
【讨论】:
【参考方案5】:在我的情况下,我想更改 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)
经过大量调查,错误是key文件中的模块与crt文件中的模块不一样
所以,为了让它工作,我创建了一个新的 csr 文件,但我必须用这个命令更改文件的名称
openssl req -new -newkey rsa:2048 -nodes -keyout mysite_new.key -out mysite_new.csr
然后我从公司提供商那里收到了一个新的crt文件,重新启动nginx并且它工作了。
【讨论】:
【参考方案6】:我遇到了这个问题,因为我以错误的顺序添加捆绑包和证书,所以也许这可以帮助其他人。
之前(这是错误的):
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 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)
【讨论】:
这实际上是一个比接受的问题更好的答案。 太棒了!这正是问题所在。 这个!谢谢。 cat certificate.crt ca_bundle.crt > bundle_chained.crt 工作了我几乎从过去 2 天开始一直在寻找解决方案。 这就是答案。谢谢!【参考方案7】:-
确保您的证书和密钥是 PEM 格式。如果没有,则使用 openssl 命令转换它们
检查公钥的 MD5 哈希以确保它与私钥中的内容匹配
openssl x509 -noout -modulus -in certificate.crt | openssl md5
openssl rsa -noout -modulus -in privateKey.key | openssl md5
【讨论】:
好建议!好吧,即使我的 md5 哈希值相同,仍然会得到相同的错误^^ 感谢您提供如何验证哈希值。我发现我有一个复制粘贴错误,并且在我的 pem 开头缺少一个破折号。你让我省了很多麻烦。干杯。【参考方案8】:当我将 bundle.crt 和 main cert 结合起来时,它发生在我身上。原因是我复制了 bundle.crt 下面的主证书。应该是反过来的
1/ 主证书 2/ bundle.crt
【讨论】:
【参考方案9】:我的问题是我没有在 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
【讨论】:
【参考方案10】:当您的 CA 颁发中间证书时也会发生这种情况
我在使用 nginx 时遇到了这个问题(两次),这篇文章中的解决方案都没有解释这个问题。一位名叫 Marco 的好绅士在此处发表的博客文章指出了这一点,我将其粘贴在这里,以供那些也遇到我所看到的内容的人使用。 https://medium.com/@mrkdsgn/steps-to-install-a-go-daddy-ssl-certificate-on-nginx-on-ubuntu-14-04-ff942b9fd7ff
在我的例子中,go-daddy 是 CA,这特定于他们如何发布证书和中间证书包。
这是 Marco 博客文章的摘录
使用 Nginx,如果您的 CA 包含中间证书,您必须创建一个包含您的证书和 CA 的中间证书的单个链式证书文件。
您可以使用此命令创建一个名为 example.com.chained.crt 的组合文件:
cat example.com.crt intermediate.crt > example.com.chained.crt
【讨论】:
【参考方案11】:我遇到了同样的问题,最后通过更改证书文件中 pem 块的顺序解决了。
证书块应该放在文件的开头,然后是中间块,然后是根块。
我通过比较有问题的证书文件和有效的证书文件发现了这个问题。
【讨论】:
【参考方案12】:我在这个问题上的 5 美分:
我有同样的问题。看了大约 1 小时后,发现证书粘贴不正确。
如果您有这样的错误,请检查您的证书。
【讨论】:
【参考方案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 docs “Where are my certificates?”
【讨论】:
或者包中证书的顺序错误:先让我们加密,然后是自己的证书。【参考方案14】:一旦您确定它们不匹配,您仍然会遇到问题 - 该怎么办。通常,证书可能只是组装不正确。当 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 等他们的私钥和公钥对不太可能与另一组混淆。
【讨论】:
这在 Nginx 上为我修复了它! 巨大的 +1 用于展示如何查看证书链中的内容。 绝对有用,我花了一个小时试图了解为什么 nginx 拒绝证书,而我可以看到它包含数据 好的,这对我来说也适用于 Comodo 证书和 Ngix。刚刚将最后一个证书块推到顶部。感谢您对此问题的详细解释和见解。 这对我有帮助!非常有用的答案!非常感谢!【参考方案15】:我得到了一个 MD5 哈希,其中密钥和证书的结果不同。
这说明了一切。您的密钥和证书不匹配。
模数应该匹配。确保您拥有正确的密钥。
【讨论】:
除非我遗漏了什么,否则您绝对希望公钥和私钥(证书文件和密钥文件)不同。 密钥和证书中的modulus' and the
public exponent' 部分必须匹配。毫无疑问,文件是不同的。密钥是为一个特定的证书生成的。
我的错。我以为他指的是文件的MD5。我现在看到证书有一个单独的模函数:How to confirm that the modulus in your private key matches the modulus in your SSL/TLS certificate’s public key prior to installation?。以上是关于SSL:错误:0B080074:x509 证书例程:X509_check_private_key:键值不匹配的主要内容,如果未能解决你的问题,请参考以下文章
Poco+OpenSSL,错误:1416F086:SSL 例程:tls_process_server_certificate:证书验证失败
使用 PyMongo 和 x509 SSL 证书连接到 MongoDB 数据库时出现 ServerSelectionTimeoutError