Apache-2.2

在 apache 中配置客戶端證書身份驗證

  • July 26, 2012

我正在嘗試Virtualhost在 apache 中設置一部分以要求客戶端身份驗證。有VirtualHost問題的還充當實際 Web 伺服器的反向代理。這是我所做的:

  • 在我用作 CA 的伺服器上創建ca.crtca.csr和。ca.key
  • 修改了的配置VirtualHost看起來像這樣:

ProxyPass / http://xxx.xxx.xxx.xxx:80/
ProxyPassReverse / http://xxx.xxx.xxx.xxx:80/
ProxyPassReverseCookiePath / /

SSLEngine On
SSLCertificateFile "/private/etc/apache2/server.crt"
SSLCertificateKeyFile "/private/etc/apache2/server.key"
SSLCertificateChainFile "/private/etc/apache2/ca_bundle.crt"
SSLCACertificateFile "/private/etc/apache2/self_ca.crt"
SSLVerifyClient none
SSLOptions StrictRequire   
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

<Location /clientauth>
   # These options force the client to authenticate with a client certificate.
   SSLVerifyClient require
   SSLVerifyDepth 1
</Location>
  • 使用我的自定義 CA 創建了一個測試客戶端證書。
  • 將客戶端證書安裝到 Mac OS X Lion 上的登錄鑰匙串中,然後手動安裝到 Firefox 中。

但我無法瀏覽到/clientauth路徑。

  • Firefox 說“SSL 對等方無法協商一組可接受的安全參數。”
  • Opera 顯示“安全連接:來自伺服器的致命錯誤 (40)”。
  • Chrome 和 Safari 顯示“HTTP 403 Forbidden”。
  • cURL(使用 .p12 文件)由於某種原因找不到密鑰…
  • cURL(使用 .crt 和 .key 文件)進行握手,發送請求,然後說“來自伺服器的空回复”。
  • apache錯誤日誌不斷重複該行Re-negotiation handshake failed: Not accepted by client!?

這是使用客戶端身份驗證和作為反向代理之間的衝突嗎?還是我做錯了什麼?

這裡的根本問題是拒絕重新談判。這源於過去一兩年來修復 TLS 漏洞的活動,並且有各種臨時修復程序拒絕重新協商,直到實施新的 TLS 擴展。因此,您需要做的一件事是確保您的 SSL (OpenSSL) 以及因此您的 Apache HTTPD 盡可能是最新的。

HTTP 客戶端僅在協商 SSL 會話後才發送 HTTP 請求,這意味著伺服器僅在設置 SSL 後才知道客戶端請求的 URL。由於您正在更改SSLVerifyClient基於 URL 的值,因此 Apache 在首次協商 SSL 會話時無法請求客戶端證書,而是必須在知道 URL 後強制重新協商會話。似乎問題在於重新協商,因此我建議您通過SSLVerifyClient requireVirtualHost塊中設置並將其從Location塊中刪除來測試它而不進行此操作。

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