如何為 NGINX 上的預設虛擬主機提供多個 SSL 憑證?

如何為 NGINX 上的預設虛擬主機提供多個 SSL 憑證?

我在 Amazon S3 上有一個靜態應用程序,透過 NGINX 代理提供服務。我使用代理的目的是允許用戶將其網域指向我的 Amazon EC2 執行個體(透過指向 的 CNAME 記錄custom-domain.myproduct.com),以便他們可以透過自己的自訂 URL 存取我的應用程序,如下所示:myproduct.happyclient.com

為了實現這一點,我有以下 nginx 配置(為簡潔起見,刪除了部分內容):

http {
    server {
    # This is my default route. References:
    # http://stackoverflow.com/a/15799883/91403
    # http://nginx.org/en/docs/http/request_processing.html

    listen 80 default_server;
    server_name custom-domain.myproduct.com;
    location / {
        proxy_pass http://static.myproduct.com; # points to Amazon S3
        proxy_set_header Host myproduct.com;
    }
}

儘管我的靜態應用程式是 100% 公開的(沒有客戶端金鑰,只有 html 和 javascript),但我的一些客戶希望透過 SSL 存取它。如何根據 Host 標頭動態選擇用於 SSL 連線的憑證?請注意,我不能簡單地對證書路徑進行硬編碼。

聚苯乙烯.:客戶將能夠將他們的憑證上傳到我的實例
PS2.:此設定僅適用於 HTTP。

我嘗試過的

我嘗試過類似的事情,但沒有成功:

server {
    listen 443 default_server;
    server_name custom-domain.myproduct.com;
    ssl on;
    ssl_certificate /etc/nginx/ssl/$http_host/server.crt; # note the http_host variable
    ssl_certificate_key /etc/nginx/ssl/$http_host/server.key; # also here
}

答案1

如何根據 Host 標頭動態選擇用於 SSL 連線的憑證?

Host 標頭是 HTTP 協定的一部分,但 HTTPS 是嵌入到 SSL 連線中的 HTTP。這意味著您必須先建立 SSL 連線(需要憑證),然後才能存取 Host 標頭。

如果客戶端支援 SNI(所有現代瀏覽器都支援,但 IE/XP 不支援),它將在 SSL 握手中發送目標名稱。根據目標名稱提供不同的憑證通常是透過 nginx 中的不同伺服器部分來完成的。您可能會嘗試在預設部分中使用$ssl_server_name,但我不確定這是否有效,即使有效,它也可能會對會話快取等優化產生負面影響。

相關內容