nginx配置失败,SSL密钥/证书(特殊情况)

我正在尝试在我的nginx反向代理上安装SSL,并使用经过认证的SSL密钥,但当我尝试重新启动服务器时,出现了以下错误信息:
Restarting nginx: [emerg]: SSL_CTX_use_PrivateKey_file("/etc/nginx/conf.d/cert.key") failed (SSL: error:0906D06C:PEM routines:PEM_read_bio:no start line error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib)
configuration file /etc/nginx/nginx.conf test failed
每个文件都是以root:root的身份,并具有600权限。 我已经测试了证书,并且它们通过了这个网站的验证:http://ssltools.com/cert_key_match。 我的密钥中没有奇怪的尾随字符,每行有64个字符。 这是我的配置文件。
server {
    listen   443;
    server_name     my.domain.com;
    ssl on;
    ssl_certificate      conf.d/cert.pem;
    ssl_certificate_key  conf.d/cert.key;

    location / {
         proxy_pass         http://upstream1;
         proxy_redirect     off;
         proxy_buffering    off;
         proxy_set_header        Host            $host;
         proxy_set_header        X-Real-IP       $remote_addr;
         proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}

有什么想法吗?谢谢

1你是否正在使用链接证书?如果是的话,你应该按照证书机构的指示进行操作。你需要同时包含链接证书。此外,我强烈不建议你将证书上传到随机网站。如果他们保存了你上传的内容,你的证书已经被泄露。你可以使用openssl直接自行验证 - user143703
是的,我是。在我的 cert.pem 文件中,我首先放置了根证书,然后在同一个文件中放置了中间证书。现在,在我的 cert.key 文件中有两个证书,其中第二个证书以 -----BEGIN RSA PRIVATE KEY----- 开头。 - Fredow
5个回答

检查这里。 希望你已经复制粘贴了以下内容:
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----

在这个例子中,cert.pem 充当的是 ssl_certificate 还是 ssl_certificate_key - Fredow
扩展名.pem始终作为证书。 - Ilja
是的,我已经做好了。这两个文件中有4个密钥,我将在这里发布我的密钥内容(这种格式太好了...): cert.pem-----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE----- cert.key -----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE----- -----BEGIN RSA PRIVATE KEY----- [...] -----END RSA PRIVATE KEY----- - Fredow
1cert.key必须仅包含私钥: -----BEGIN RSA PRIVATE KEY----- [...] -----END RSA PRIVATE KEY----- - Ilja
我的供应商(ssl.com)给我发送了包含两个密钥的私有证书文件。我尝试删除另一个证书,但是仍然遇到相同的错误。 - Fredow
购买新的SSL证书的标准方式如下:
  1. 您决定要为哪个域名购买SSL证书,例如:www.mysite.com。
  2. 为您的域名生成CSR,并使用您的私钥签名(在服务器上或在线提供商页面上)。填写有关新域名所有者的信息表格。
  3. 将您的CSR发送给SSL供应商(在您的情况下是ssl.com)。
  4. 他们会"检查"您的CSR并为www.mysite.com颁发新的SSL证书(.pem文件)。并向您提供.pem文件(证书)和ca-bundle - 用于您的证书的附加文件。现在可以使用任何密钥!
- Ilja
1我已经在本地解决了我的问题。与Nginx和Apache的密钥格式不同,而且bundle密钥中有3个证书,而不是两个。感谢你的帮助IIja,非常感谢。 - Fredow

一个可能适用于其他人的不同解决方案: 使用`.pem`文件作为`ssl_certificate`和`ssl_certificate_key`的值。 换句话说:
...
ssl on;
ssl_certificate      conf.d/cert.pem;
ssl_certificate_key  conf.d/cert.pem;
...

请注意,确保你的BEGIN块与预期的块完全相同,每个字符都要一致。我的开始部分是4个破折号,而不是5个---------不同。当你犯这个错误时,验证工具的错误信息并不是很具体。

我遇到了同样的问题(来自/var/log/nginx/error.log)
2019/03/20 01:25:41 [emerg] 2509#0: SSL_CTX_use_PrivateKey_file("/etc/nginx/conf.d/sslcert/mm.merchantspring.com.au.key") failed (SSL: error:0906D06C:PEM routines:PEM_read_bio:no start line:Expecting: ANY PRIVATE KEY error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib)

然后我发现我的密钥文件还需要与证书链接在一起。更新了密钥文件后,重新启动nginx,它就正常工作了。

我的环境:

Nginx配置文件如下:

    ssl_certificate /etc/nginx/conf.d/sslcert/mywebsite.pem;
    ssl_certificate_key /etc/nginx/conf.d/sslcert/mywebsite.key;

我的网站.pem(链式,共有4个证书。cat mywebsite.crt intermediate.crt > mywebsite.pem):
-----BEGIN CERTIFICATE-----
...

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

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

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

-----END CERTIFICATE-----

我的网站.key:(与crt和key链接)

-----BEGIN CERTIFICATE-----
 ...
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----

我从Godaddy网站上获取了密钥文件,而不是使用openssl创建它。但是我确实认为使用openssl会更好一些。

我遇到了这个错误,是因为我不小心在ssl_certificate_key指令中使用了.cer文件而不是.key文件。