Apache-2.4

Apache 2.4:僅非 GET 方法需要客戶端證書

  • October 25, 2021

我們有一個在 HTTP 上執行的內部服務,它前面有一個 Apache 2.4 實例(Debian Bullseye)作為 HTTPS 的代理。Apache 和 HTTPS 已啟動並正在執行,但對客戶端證書還有一個額外要求——具體而言,GET 和 HEAD 請求可以匿名進行,但所有其他方法必須提供符合特定條件的有效客戶端證書。

我們建構的軟體以 IIS 為目標,因此 Apache 對我們來說是一個未知數(最初的實施者已經離開)。我們嘗試調整我們繼承的配置的配置的站點部分(省略證書文件路徑指令)為:

SSLVerifyClient optional
SSLVerifyDepth 10

ProxyPass /internal http://<internalIP>:/internal
ProxyPassReverse /internal http://<internalIP>:/internal
SSLOptions +StdEnvVars

<Location /internal>
 Order deny,allow
 Allow from all

 <LimitExcept GET>
   SSLRequire ( %{SSL_CLIENT_S_DN_O} eq "(org)" and %{SSL_CLIENT_S_DN_OU} eq "(unit)" and %{SSL_CLIENT_S_CN} eq "(name)" )
 </LimitExcept>
</Location>

我們還沒有嘗試使用客戶端證書,例如。POST 因為一個簡單的 GEThttps://<proxy>/internal現在失敗並顯示 403 和 errors.log 消息:

AH02229:訪問代理:http://{internalIP}/internal 失敗,原因:未滿足 SSL 要求表達式

乍一看,這似乎SSLRequire也適用於 GET,與<LimitExcept>.

我們可以使用指令組合來獲得所需的行為嗎?(理想情況下,它也會遠離明顯現在已棄用SSLRequire的東西。)

您可以使用mod_ssl基本身份驗證來僅允許提供有效證書的人。您需要LimitExcept像這樣修改部分:

<LimitExcept GET>
   AuthType Basic
   AuthName "no-GET thingy"
   Require ssl-verify-client
</LimitExcept>

您可以使用任意數量和組合的Require語句,因此如果您還想檢查證書屬性,可以執行以下操作:

<LimitExcept GET>
   AuthType Basic
   AuthName "no-GET thingy"
   <RequireAll>
       Require ssl-verify-client
       Require expr "'${SSL_CLIENT_S_DN_O}' == 'org'"
       Require expr "'${SSL_CLIENT_S_DN_OUT}' == 'theOU'"
       Require expr "'${SSL_CLIENT_S_DN_CN}' != 'notThisUser'"
   </RequireAll>
</LimitExcept>

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