Ssl

無法從 apache 獲取客戶端證書鏈

  • September 19, 2019

我正在嘗試將客戶端證書鍊和根從 apache 獲取到我的 Java 後端。

這是我的 apache 配置的相關部分:

 SSLOptions +StdEnvVars +ExportCertData
 RequestHeader set "SSL_CLIENT_CERT" "%{SSL_CLIENT_CERT}e"
 RequestHeader set "SSL_CLIENT_CERT_CHAIN_0" "%{SSL_CLIENT_CERT_CHAIN_0}e"
 RequestHeader set "SSL_CLIENT_ROOT_CERT" "%{SSL_CLIENT_ROOT_CERT}e"

我能夠獲得客戶端證書,但根證書和中間證書是null. 我已經從 tcpdump 驗證了根證書和中間證書正在發送到 apache。

我的 apache 版本是 2.4.6。

我看過類似的問題,例如

如何在使用 Apache 進行證書身份驗證期間獲取客戶端證書鏈? SSL_CLIENT_CERT_CHAIN 未傳遞到後端伺服器

但答案並沒有解決我的問題。任何想法為什麼他們沒有被通過?謝謝。

回答我自己的問題以供參考。

SSL_CLIENT_CERT_CHAIN_0和未通過的原因SSL_CLIENT_ROOT_CERT是因為它們是從客戶端上傳的證書中提取的。我以為它們會從信任庫中提取,但查看 httpd 原始碼我發現它們沒有。

httpd 呼叫 openssl 函式 SSL_get_peer_cert_chain()來填充 SSL_CLIENT_CERT_CHAIN_nandSSL_CLIENT_ROOT_CERT欄位。從 openssl 文件https://www.openssl.org/docs/man1.1.0/man3/SSL_get_peer_cert_chain.html中,該函式僅返回peer 發送的 peer 鏈。這就是中間和根被傳遞為 null 的原因,因為在我的例子中,它們是從信任儲存而不是客戶端獲得的。

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