Apache-2.4
Apache 2.4:僅非 GET 方法需要客戶端證書
我們有一個在 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 因為一個簡單的 GET
https://<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>