Authentication
Apache 2.4 代理伺服器獲得客戶端身份驗證但不將其傳遞給 tomcat
我以前有 Apache 2.2.17 作為反向代理執行,它會請求客戶端身份驗證(使用 SSLVerifyClient)並將該身份驗證傳遞給 jetty/tomcat 應用程序 servlet 引擎。然後我的 Java 應用程序將從請求中讀取該資訊 (x509Certificate)。
在升級到新伺服器時,我們決定遷移到最新版本的 Apache,但這個過程似乎不再有效。Apache 仍然請求客戶端身份驗證,但它似乎沒有將其傳遞給 Tomcat。
以下是工作(v2.2.17)httpd.conf 文件的相關位:
<VirtualHost _default_:443> ServerName xxxxxxxx SSLEngine On SSLCertificateFile conf/ssl-prod/xxxxxxxx.crt SSLCertificateKeyFile conf/ssl-prod/xxxxxxxx.key SSLCACertificatePath conf/ssl.certs/ <Location /> ProxyPass http://xxxxxxxx:8009/ ProxyPassReverse http://xxxxxxxx:8009/ Order deny,allow Allow from all </Location> <Location /login/> SSLVerifyClient optional SSLVerifyDepth 10 ProxyPass http://xxxxxxxx:8009/ ProxyPassReverse http://xxxxxxxx:8009/ Order deny,allow Allow from all </Location> </VirtualHost>
因此,它只是一個標準的 SSL 代理,直到使用者轉到“登錄”文件夾中的頁面,此時 apache 要求進行客戶端身份驗證。
我嘗試設置一些其他變數,看看這是否會導致它在 ProxyPreserverHost On(和 Off)上工作 ProxyAddHeaders 但沒有成功。
在遷移到 2.2.23 分支的最新版本時,我們也遇到了同樣的問題,但是當我們將使用的舊版本複製到新伺服器時,它執行良好。唯一的其他區別是我們正在從 32 位伺服器遷移到 64 位伺服器(兩個 Windows 都使用 ApacheLounge 執行檔)。
有任何想法嗎?
您沒有任何機制將有關經過身份驗證的客戶端的資訊傳遞給 Tomcat 伺服器。
AJP 是預設情況下在埠 8009 上使用的協議,而不是 HTTP - 它具有用於傳遞客戶端證書數據的內置機制(只要
SSLOptions +ExportCertData
在 Apache 中就位)。你確定你不打算使用它嗎?如果沒有,您將需要在 Apache 以及您的 Tomcat 應用程序中實現一些東西來處理這個問題。可能是包含有關客戶端證書資訊的 HTTP 標頭。