Apache-2.2

當在 apache 中禁用 keepalives 時,MS 客戶端拒絕 SSL 重新協商

  • January 12, 2010

我們的合作夥伴之一正在使用 Microsoft Web Services 2.0 通過 Apache HTTPD 2.0 反向代理連接到我們的 Web 服務。他們發佈到的資源需要客戶端(相互)ssl 身份驗證:

<Location /SecuredArea>
   SSLVerifyClient require
   SSLDepth 10
   SSLCACertificatePath /path/to/clientcas
   SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \
                and %{SSL_CLIENT_S_DN_CN} in { "List", "of", "accepted" "names" } \
   }
</Location>

很快,我們注意到相隔不到 1 分鐘到達的請求會失敗。Web 客戶端返回Could not create SSL/TLS secure channel.

apache錯誤日誌顯示:

[debug] ssl_engine_kernel.c(1893): OpenSSL: Write: SSLv3 read client hello B
[debug] ssl_engine_kernel.c(1912): OpenSSL: Exit: error in SSLv3 read client hello B
[error] [client 12.34.56.78] Re-negotiation handshake failed: Not accepted by client!?

訪問日誌顯示:

12.34.56.78 - - [11/Jan/2010:13:58:39 -0500] "POST /SecuredArea HTTP/1.1" 403 - "-" "Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.3603)"

由於合作夥伴可以毫無問題地連接到其他幾個站點,因此他們對排除故障不感興趣。我不知道他們的其他對等方是如何配置的,甚至他們正在執行什麼。

我嘗試了這個 apache 錯誤的所有解決方法,包括將測試伺服器升級到 Apache 2.2。

我還在程序間會話記憶體中看到了由大會話大小引起的錯誤 PUT。從 dbm更改SSLSessionCache為 shmcb 清除了這些,但沒有解決實際問題。

最後,我找到了兩個修復:

  1. SSLVerifyClient通過移動到VirtualHost上下文擺脫 SSL 重新協商。由於 VirtualHost 下的其餘資源不打算進行客戶端身份驗證,這意味著為一個資源設置單獨的主機。
  2. 註釋掉BrowserMatch ".\*MSIE.\*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0 我擔心刪除它會在未來產生意想不到的後果。

問題是,這些解決方案中哪個更好?還是還有一個?如果這個網站永遠不會有活生生的使用者,那麼刪除這些BrowserMatch設置的風險有多大?


1.) 是因為這個而被推薦的,所以無論如何#1 是一個好主意。

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