Authentication

Apache 2.4 代理伺服器獲得客戶端身份驗證但不將其傳遞給 tomcat

  • February 3, 2014

我以前有 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 標頭。

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