如何在 Apache 中禁用 TLS 1.1 和 1.2?
我有一個執行 Apache 2.2.22 的 Ubuntu 12.04.2 LTS 伺服器,帶有 mod_ssl 和 OpenSSL v1.0.1。
在我的 vhosts 配置中(所有其他的行為都如我所料),我
SSLProtocol
有-all +SSLv3
.使用該配置,TLS 1.1 和 1.2 已啟用並正常工作 - 這對我來說是違反直覺的,因為我預計在該配置下只會啟用 SSLv3。
我可以使用 啟用/禁用 TLSv1
-/+TSLv1
,它按預期工作。但是+/-TLSv1.1
並且+/-TLSv1.2
不是有效的配置選項——所以我不能那樣禁用它們。至於我為什麼要這樣做——我正在處理一個第三方應用程序(我無法控制它),它在啟用 TLS 的伺服器上有一些錯誤行為,我需要完全禁用它才能繼續前進。
對這個錯誤很感興趣(是的,我已經能夠重現它)我查看了最新穩定版本的原始碼
mod_ssl
並找到了解釋。忍受我,這會變得業餘堆棧溢出:解析後
SSLProtocol
,結果char
如下所示:0 1 0 0 ^ ^ ^ ^ | | | SSLv1 | | SSLv2 | SSLv3 TLSv1
在啟動新的伺服器上下文時,將啟用所有可用的協議,並
char
使用一些漂亮的按位 AND 操作檢查以上內容,以確定應該禁用哪些協議。在這種情況下,SSLv3 是唯一明確啟用的協議,其他 3 個協議將被禁用。OpenSSL 支持 TLSv1.1 的協議設置,但由於
SSLProtocol
不考慮此選項,因此它永遠不會被禁用。OpenSSL v1.0.1 與 TLSv1.2 有一些已知問題,但如果它受支持,我想這與 TLSv1.1 相同;它不被 mod_ssl 辨識/處理,因此永遠不會被禁用。mod_ssl 的原始碼參考:
SSLProtocol
在第 925 行解析pkg.sslmod/ssl_engine_config.c
上述函式中使用的選項在第 444 行定義
pkg.sslmod/mod_ssl.h
所有協議在第 586 行啟用,
pkg.sslmod/ssl_engine_init.c
然後在後續行中禁用特定協議那怎麼禁用呢?
你有幾個選擇:
- 在 OpenSSL 配置文件中禁用它:
Protocols All,-TLSv1.1,-TLSv1.2
2. 重寫mod_ssl
;-)