Apache-2.2

要求 Apache 中特定中間 CA 頒發的客戶端證書

  • January 30, 2018

我有這樣的 CA 層次結構:

根CA
________|_____________
| |
測試-CA 生產-CA
_____|_____ ____|____
| | | |
測試-SRV 測試-CLI 產品-SRV 產品-CLI

從 PROD-SRV 伺服器證書標識的生產伺服器的角度來看,我將如何設置 Apache mod_ssl 以要求 PRODUCTION-CA 簽名的 PROD-CLI 客戶端證書,並且不允許具有 TEST-CLI 證書的客戶端簽名測試-CA?


目前我有:

SSLCertificateFile prod_srv.crt
SSLCertificateKeyFile prod_srv.pem
SSLCADNRequestFile prod_ca.crt
SSLCACertificateFile root_ca.crt

這看起來很有效,因為伺服器向瀏覽器詢問 PROD CLI 證書,但如果我提供 TEST CLI 證書,則會建構有效的證書路徑,並且生產系統接受測試客戶端。

查看SSLRequire指令 - 以下規則應查看所提供證書的頒發者欄位(即 CA 證書),選擇 CN,並將其與您的 PRODUCTION-CA 證書的名稱相匹配。

SSLRequire %{SSL_CLIENT_I_DN_CN} == "PRODUCTION-CA"

我想使用中間 CA 的子 CA 頒發的證書對客戶端進行身份驗證,如下所示:

              Root-CA
                 |
           Intermediate-CA
         ________|_____________
        |                      |
     SUB-CA 1               SUB-CA 2
   _____|_____             ____|____
  |           |           |         |
TEST-SRV   TEST-CLI    PROD-SRV   PROD-CLI

您可以使用 SSL_CLIENT_CERT_CHAIN_n 變數來檢查鏈,例如執行以下操作:

SSLRequireSSL
SSLVerifyClient require
SSLCACertificateFile ".../root-ca.cert.pem"
Require expr %{SSL_CLIENT_CERT_CHAIN_1} == file(".../intermediate.cert.pem")

甚至多個一級中間CA:

Require expr %{SSL_CLIENT_CERT_CHAIN_1} in { file(`".../intermediate.cert.pem"), file(".../intermediate2.cert.pem") }

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