Nginx放弃与多个虚拟主机进行SSL握手

时间:2015-12-31 00:46:15

标签: redirect ssl nginx

我在具有多个主机(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;

指出其他明显错误也值得赞赏。

1 个答案:

答案 0 :(得分:2)

删除

解决(至少现在)
server {  
    listen 443;

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

似乎由于没有指定证书,因此所有HTTPS请求都会遇到此块,然后连接将被删除。