Nginx

Nginx 多個伺服器阻止 SSL 和非 SSL

  • September 15, 2017

我在 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)。這是您複製粘貼配置的答案的實際解決方案。

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