Ssl
無法從 apache 獲取客戶端證書鏈
我正在嘗試將客戶端證書鍊和根從 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_n
andSSL_CLIENT_ROOT_CERT
欄位。從 openssl 文件https://www.openssl.org/docs/man1.1.0/man3/SSL_get_peer_cert_chain.html中,該函式僅返回peer 發送的 peer 鏈。這就是中間和根被傳遞為 null 的原因,因為在我的例子中,它們是從信任儲存而不是客戶端獲得的。