SSL和Ngnix:在SSL握手时,服务器在侦听SSL端口时未定义“ ssl_certificate”


23

我设法用没有错误的LE创建了我的证书,我也设法将流量从端口80重定向到端口443。但是,当我重新加载nginx服务器时,我无法访问我的网站。Ngnix错误日志显示以下行:

4 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: 192.168.0.104, server: 0.0.0.0:443

我认为这意味着它找不到我随后导航到证书路径的证书,而且它们都在那儿,这可能是什么问题?这是我的Ngnix配置的样子:

server {
       listen         80;
       server_name    pumaportal.com www.pumaportal.com;
       return         301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;

    server_name pumaportal.com www.pumaportal.com;

    add_header Strict-Transport-Security "max-age=31536000";

    ssl_certificate /etc/letsencrypt/live/pumaportal.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/pumaportal.com/privkey.pem;

    ssl_stapling on;
    ssl_stapling_verify on;

    access_log /var/log/nginx/sub.log combined;

    location /.well-known {
       alias /[MY PATH]/.well-known;
    }

    location / {
        proxy_pass http://localhost:2000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-Forwarded-For $remote_addr;
    }

}

一切似乎很简单,我不知道问题可能在哪里。

运行nginx -t之后,一切似乎都还可以:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

还有其他server街区吗?遇到错误时,您到底做了什么?
Tero Kilkanen

1
Nginx用户是否有权访问证书文件和密钥文件?拥有对文件的读取访问权限是不够的,用户还需要具有对该文件链中所有目录的读取和执行权限。
珍妮D说恢复莫妮卡

Answers:


25

我的猜测是,您有另一台服务器正在侦听端口443。此服务器未定义ssl_certificate,并且会自动选择(SNI)。尝试从启用了/ etc / nginx / sites的服务器上删除所有符号链接,除非您要使这台服务器正常工作(如果可能的话,否则请检查所有服务器以侦听443而不正确配置)。


2
答对了!就我而言,我为vhost mail.mydomain创建了配置文件,因此我可以为dovecot安装建立LE证书,而忘记添加配置文件。
Marcos Regis

7

我今天早上早些时候解决了这个问题,所以我在这里澄清一下CA的观点(现在我已经知道了这个问题,做得很好),您很可能有两个服务器块:

#默认
服务器{
    监听443 default_server; #注意缺少`ssl`
    服务器名称 _;
    #...
}

#real网站
服务器{
    听443 ssl;
    服务器名称 ;
    #...
}

SNI 在标记有ssl侦听器的那些上匹配。但是,默认服务器将在443上捕获所有传入流量,无论是否启用SSL。因此,实际上,通过NI积所有流量,实际上使SNI根本无法工作。

症状:

  • 看来nginx没有加载您的配置(即使使用nginx -t和重新加载了服务)
  • 错误说明“在服务器块中找不到ssl_certificate”
  • nginx只是将您的主机应用于默认的443侦听器。

解决方案:

我今天上午通过删除默认服务器块解决了问题,因此允许SNI在SSL侦听器上进行匹配。

另一种解决方案是将ssl侦听器和ssl_certificate行添加到服务器块中,以便从根本上在默认主机上启用SNI。您仍然会遇到SSL错误,因此它不是最佳解决方案,但是它将使您的SNI发挥作用:)


5

您需要default_server在nginx配置中定义一个参数。

适用default_server于任何example.com或www.example.com。不是都。

因此,这将起作用:

server {
    listen 443 ssl;
    listen 80;

    server_name example.com;
    return 301 https://www.example.com$request_uri;
}

server {
    listen 80 default_server;

    server_name www.example.com;
    return 301 https://www.example.com$request_uri;
}

server {
    listen 443 ssl default_server;

    server_name www.example.com;
    root /var/www/example.com/public;
    index index.php index.html index.nginx-debian.html;

    ssl on;
    ssl_certificate /etc/ssl/chain.crt;
    ssl_certificate_key /etc/ssl/examplecom.key;

    (rest of your nginx config goes here....)
}

关于虚拟主机的注意事项:default_server如果服务器上有多个主机,请确保未在其他任何地方定义该参数。


非常好的ssl正在为我工​​作
Josua Marcel Chrisano

1

像往常一样迟到游戏,但是因为它对我有帮助...请检查证书是否格式错误。在构建“统一的” crt(crt +中间体)时,

$cat server.crt provider.intermediate > unified.crt

我以某种方式丢失了LF,得到了这样的一行:

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

代替

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

并且nginx不会获得证书,并因上述错误而失败。

在做

# openssl x509 -in unified.cert -text -out

给了我openssl提示错误的线索。


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.