Nginx

Nginx SSL 身份驗證幕客戶端證書

  • May 18, 2021

我使用以下配置使用帶有 TLS 身份驗證的 Nginx。所有具有有效客戶端證書的請求都將在 Nginx 終止,請求將被轉發到後端應用程序。


   upstream app {
       server app:8080;
   }

   server {
       listen                 443 ssl;
       server_name            localhost;
       ssl_certificate        /etc/ssl/cert_example_com.crt;
       ssl_certificate_key    /etc/ssl/cert_example_com.key;
       ssl_client_certificate /etc/ssl/ca.crt;
       ssl_protocols          TLSv1.2 TLSv1.3;
       ssl_ciphers            HIGH:!aNULL:!MD5;
       ssl_verify_client      on;

       location / {
               proxy_pass         http://app;
               proxy_set_header   X-Forwarded-For $remote_addr;
               proxy_http_version 1.1;
               proxy_set_header   Upgrade $http_upgrade;
               proxy_set_header   Connection 'upgrade';
               proxy_set_header   Host $host;
               proxy_cache_bypass $http_upgrade;
       }
   }

使用此配置,我希望 Nginx 僅對某些客戶端證書進行身份驗證。這是因為我使用 Private RootCA 來生成 A 類證書和 B 類證書。A 類證書與 MQTT 一起用於身份驗證,B 類證書用於 Nginx ( HTTPS) 身份驗證。

MQTT 的客戶端證書(A 類)對於每個客戶端都是唯一的<UUID>.example.com。Nginx 的客戶端證書(B 類)將具有名稱(DN)base.example.com,並且證書將在多個客戶端之間共享。base.example.com此外,同一名稱 (DN)和不同證書 ID的 B 類證書數量有限。

對此有什麼幫助我怎麼能做到這一點?

所有證書都將被驗證,但您仍然可以通過檢查客戶端證書的 DN 來拒絕使用其他證書的連接請求。

例如:

server {
   if ($ssl_client_s_dn !~ \bbase\.example\.com\b) { return 403; }
   ...
}

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