Nginx 多個伺服器阻止 SSL 和非 SSL
我在 nginx.conf 中需要一些幫助。我需要使用客戶端證書身份驗證從 /devices 開始保護資源。其他資源通過 https 但不需要客戶端證書。
我使用儲存庫在 ubuntu 16.04 上安裝了 nginx。然後,我在 /etc/nginx/conf.d/ 中創建了一個名為 dozee.conf 的文件,並粘貼了來自 serverfault Q&A ( https://serverfault.com/a/721704/80340 ) 的內容並根據需要進行了修改。
dozee.conf 裡面的配置看起來像
server { listen *:443 ssl; server_name localhost; ssl on; ssl_certificate /etc/nginx/server.crt; ssl_certificate_key /etc/nginx/server.key; ssl_client_certificate /etc/nginx/ca.crt; ssl_verify_client on; location /device { proxy_pass http://localhost:8080/device; proxy_read_timeout 90; #proxy_redirect http://localhost/ $scheme://$host:$server_port/; } } server { listen *:443 ssl; ssl on; ssl_certificate /etc/nginx/server.crt; ssl_certificate_key /etc/nginx/server.key; ssl_client_certificate /etc/nginx/ca.crt; ssl_verify_client off; location / { proxy_pass http://localhost:8080/; proxy_read_timeout 90; #proxy_redirect http://localhost/ $scheme://$host:$server_port/; } }
我在這裡面臨的問題是 nginx 的行為由第二個伺服器塊主導。
如果我將
ssl_verify_client off;
第二個伺服器塊更改為ssl_verify_client on;
兩個路徑/
並/device
開始詢問客戶端證書。如果我保留
ssl_verify_client
他們off
都不需要客戶證書。我在這裡做錯了什麼?
您的第一個
server
塊僅匹配諸如https://localhost/some/url
. 所有其他請求都由第二個server
塊處理。但是,可能 nginx 不能用於您想要的案例。初始化 TLS 連接時,沒有關於 nginx 上層 HTTP 請求的資訊來決定它是否應該需要來自客戶端的客戶端證書。它只能根據在 TLS 連接設置中與 SNI 一起傳遞的虛擬主機名資訊來執行此操作。
在 Apache 中,可以強制基於 URL 路徑重新協商 TLS,然後 Apache 請求客戶端證書。我在 nginx 中沒有找到類似的選項。
因此,您使用 nginx 的唯一選擇可能是為您的設備使用另一個虛擬主機(例如 devices.example.com)。這是您複製粘貼配置的答案的實際解決方案。