我在具有多个主机(1个IP)的Ubuntu VPS上设置了Nginx服务器。以前,1个主机设置了证书,没有重定向(允许http),1个主机有证书,并通过301强制HTTPS。现在我试图强制所有主机使用SSL并强制HTTPS,我看到Nginx正在丢弃当我有超过1个带有301指令的虚拟主机时握手。特别是,我看到的错误是:
[error] 12370#0: *30 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: (removed), server: 0.0.0.0:443
问题肯定出现在我的301上,因为如果我排除它们,我就没有问题。我可以在服务器块中强制使用HTTPS和非www的最佳方法是什么?
我的所有虚拟主机都在/etc/nginx/conf.d
,以及ssl.conf
(如下所列)。我可以根据要求提供nginx.conf
,但我没有看到任何看起来有用的东西。
example1.conf
server {
server_name www.example1.com example1.com;
return 301 https://example1.com$request_uri;
}
server {
listen 443;
server_name www.example1.com
return 301 https://example1.com$request_uri;
}
server {
listen 443 ssl;
server_name example1.com;
ssl_certificate /etc/letsencrypt/live/example1.com/cert.pem;
ssl_certificate_key /etc/letsencrypt/live/example1.com/privkey.pem;
root /var/www/example1.com;
location / {
try_files $uri $uri/ $uri.html =404;
}
access_log /var/log/nginx/example1.com.access.log;
error_log /var/log/nginx/example1.com.error.log;
}
example2.conf
与example1.conf
相同(除了example2.com而不是example1.com)
ssl.conf
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# Perfect Forward Security
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS +RC4 RC4";
# HSTS
add_header Strict-Transport-Security max-age=31536000;
指出其他明显错误也值得赞赏。
答案 0 :(得分:2)
删除
解决(至少现在)server {
listen 443;
server_name www.example1.com
return 301 https://example1.com$request_uri;
}
似乎由于没有指定证书,因此所有HTTPS请求都会遇到此块,然后连接将被删除。