Nginx

虛擬主機和 SSL 之間的 Nginx 問題

  • January 23, 2017

我在同一個 IP 中有兩個站點,配置如下:

  • site1.com

    • 多個子域(即:foo.site1.com、bar.site1.com)
    • 一切都在埠 80 上偵聽,443 中沒有任何東西

  • site2WithSSL.com

    • 監聽埠 80 和 443 (SSL)

我可以毫無問題地訪問https://site2WithSSL.com>和<http://site1.com 。當有人想訪問https://site1.com時,問題就出現了,nginx 用 site2WithSSL.com 回答我想避免這種情況。我的意思是,每當有人訪問https://site1.com時,都不需要返回任何內容,或者只需重定向到https ://

配置是:

server {
    listen      80;
    server_name    *.site1.com;

    // ...
}

server {
    server_name www.site2WithSSL.com;
    return 301 $scheme://site2WithSSL.com$request_uri;
}

server {
    listen 80;
    listen 443 ssl;
    server_name site2WithSSL.com;
    ssl_certificate site2WithSSL.crt;
    ssl_certificate_key site2WithSSL.key;

    // ...
}

已解決:為每個站點使用不同的 ip

您的問題是 SSL 不支持同一 IP 上的多個虛擬主機。

當 NGINX 通過 HTTP/1.1 接收到新連接時,請求包含一個 HOST 標頭,指定要服務的虛擬主機(這是 1.1 中的重大變化,並允許我們今天所知道的虛擬主機)。

但是使用 HTTPS,標頭是加密的,並且必須建立密鑰交換和 TLS 層才能解密。換句話說,在發送 SSL 證書之前,nginx 無法選擇正確的 SSL 伺服器塊。

您可以在 site2 的配置下添加匹配 site1 的域名的重定向,但使用者仍然會收到一條消息說證書無效,所以這不是很可口。

您可以使用一些多域證書,但需要付費。

最簡單的,並且對於您想要的配置,可能是最好的選擇,是為每個站點使用不同的 IP 地址。不同的 NGINX 伺服器配置可以綁定到不同的地址,因此永遠不會有關於哪個是哪個的問題。大多數提供商可以為您提供多個 IP 地址,有些甚至多個塊,當然在雲中您可以提供更多。

更新:SNI 通過將 Host 標頭移到加密有效負載之外來解決此問題,並且受現代瀏覽器支持。

引用自:https://serverfault.com/questions/583136