
我在 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
,但我不確定這是否有效,即使有效,它也可能會對會話快取等優化產生負面影響。