我已成功使用 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
答案1
我猜想您有另一台服务器正在监听端口 443。此服务器未定义 ssl_certificate,并且会自动选择 (SNI)。尝试从 /etc/nginx/sites-enabled 中删除除您要使其工作的这台服务器之外的所有符号链接(如果可能,否则请检查所有服务器是否未正确配置而监听 443)。
答案2
我今天早上已经解决了同样的问题,所以我在这里澄清一下 CA 的观点(现在我理解了问题,这个观点很有道理),你很可能有两个服务器块:
# 默认 服务器 { listen 443 default_server; # 注意缺少 `ssl` 服务器名称 _; #... } #真实网站 服务器 { 听443 ssl; 服务器名称 ; #... }
SNI 将仅有的匹配那些带有ssl
监听器的标签。但是,默认服务器将抓取全部443 上的传入流量,无论是否使用 SSL。因此,它实际上通过将所有流量都留给自己,从一开始就阻止了 SNI 的实际工作。
症状:
- 看起来好像 nginx 没有加载你的配置(即使
nginx -t
重新加载了服务) - 错误提示“服务器块中未找到 ssl_certificate”
- nginx 只是将您的主机应用到默认的 443 监听器。
解决方案:
我今天早上通过删除默认服务器块解决了这个问题,从而允许 SNI 匹配 SSL 侦听器。
替代解决方案是将ssl
侦听器和ssl_certificate
行添加到服务器块,以便 SNI 在您的默认主机上基本启用。您仍然会收到 SSL 错误,因此这不是最好的解决方案,但它可以让您的 SNI 正常工作 :)
答案3
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
关于虚拟主机的注意事项:如果服务器上有多个主机,请确保该参数未在其他任何地方定义。
答案4
检查证书的文件权限是否正确。请发布目录列表 ( ls -la
)