Tomcat關於DH算法問題解決辦法

Tomcat 老版本存在的問題

Tomcat6的版本中是支持SSLv3和Diffie-Hellman算法的。研究人員指出,LogJam出現在常用的密鑰交換加密演算法中(Diffie-Hellman key exchange),這個演算法讓HTTPS、SSH、IPSec及SMTPS等網絡協定產生共享的加密密鑰,並建立安全連線。LogJam漏洞使***得以發動中間人***,讓有漏洞的TLS連線降級爲512-bit出口等級的密碼交換安全性,再讀取或修改經由TLS加密連線傳輸的資料。該漏洞情況與三月爆發的FREAK頗爲類似,差別在於它是基於TLS協定的漏洞,而非實際的瑕疵,而且***目的爲Diffie-Hellman,不是RSA的密鑰交換。

Firefox 39版本後瀏覽器要求服務器必須關閉服務端 SSLv3存在漏洞的加密套件,否則禁止訪問服務器頁面,並出現 在服務器密鑰交換握手信息中 SSL 收到了一個弱臨時 Diffie-Hellman 密鑰。(錯誤碼: ssl_error_weak_server_ephemeral_dh_key)錯誤。

爲徹底解決 Tomcat上默認開啓SSLv3和使用弱口令算法導致的Firefox無法訪問的問題,建議使用以下2個方案:

  1. 升級 Tomcat版本到7及其以上版本。
    由於升級涉及到業務系統調試和改造,推薦您視您的業務系統的正常使用而定,升級後您需要在SSL配置中配置
<Connector port="443"
protocol="org.apache.coyote.http11.Http11Protocol"
SSLEnabled="true"
maxThreads="150" 
scheme="https" 
secure="true"
keystoreFile="conf\keystore.jks"
keystorePass="password"
clientAuth="false"
sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2"
ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA,SSL_RSA_WITH_RC4_128_SHA"/>
  1. 採用 Apache/Nginx 與 Tomcat 整合的方式,將證書遷移到 Apache/Nginx 的 Web 前端上進行配置。
    Apache 與 Tomcat 整合的方式,需要在您原有服務器上安裝配置 Apache。該方案風險性極小,您 Tomcat上部署的應用不需要做任何變更,只需要將原有 Tomcat 上的證書進行格式轉換,並將證書部署到前端 Apache上即可。

Apache + Tomcat 的整合配置:

我們需要使用Apache的ProxyPass來轉發URL後端,需要下面兩個模塊

mod_proxy.so
mod_proxy_http.so

我們還需要實現客戶端瀏覽器訪問http自動轉成https協議,需要下面的模塊

mod_rewrite.so

編輯/etc/httpd/conf/httpd.conf中

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
#具備以上2行是說明apache具備將URL轉發給Tomcat的能力
#測試頁面add by sxr
ProxyPass /examples http://192.168.1.10:8080/examples/
ProxyPa***everse /examples http://192.168.1.10:8080/examples/

測試,訪問192.168.1.10/examples後,自動跳轉到了後端Tomcat的192.168.1.10:8080/examples頁面。

配置Apache在https協議中實現ProxyPass轉發URL到Tomcat
實現原理:客戶瀏覽器訪問Apache的htts協議,在Aapache的ssl.conf配置文件中配置ProxyPass轉發,將請求轉發給後端的Tomcat服務器,這樣就實現了在https協議的基礎上Apache將URL轉發給Tomcat。

注意:此時,客戶端瀏覽器必須使用https://192.168.1.10/docs訪問才能實現URL轉發。

  1. 編輯/etc/httpd/conf/httpd.conf
Include conf.d/*.conf
#加載其他的配置文件,主要是爲了使用ssl.conf保存。
  1. 編輯/etc/httpd/conf.d/ssl.conf,支持https協議
LoadModule ssl_module modules/mod_ssl.so
Listen 443
##
## SSL Virtual Host Context
##

ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
SSLCertificateFile conf/ssl.crt/server.crt    將服務器證書配置到該路徑下
SSLCertificateKeyFile conf/ssl.key/server.key  將服務器證書私鑰配置到該路徑下
#SSLCertificateChainFile conf/ssl.crt/ca.crt 刪除行首的“#”號註釋符,並將中級CA證書intermediatebundle.crt配置到該路徑下

SSLOptions +StdEnvVars
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
#在https協議中實現ProxyPass轉發URL,實際就是在ssl.conf中添加ProxyPass語句
ProxyPass /test http://192.168.1.10:8080/examples
ProxyPa***everse /test http://192.168.1.10:8080/examples
ProxyPass /docs http://192.168.1.10:8080/docs
#注意,末尾沒有/符號,http://192.168.1.10:8080/docs/是錯誤的
ProxyPa***everse /docs http://192.168.1.10:8080/docs
#注意:轉發到Tomcat的URL中末尾不能加/符號。

Apache 實現ProxyPass轉發URL到Tomcat並實現http自動轉https
寫成ProxyPa***everse /docs http://192.168.1.10:8080/docs

  1. 配置Apache,實現http自動轉換成https協議
    上面,我們已經完成了在https協議上實現將URL轉發給Tomcat。接下來,我們只要配置Apache,實現http自動轉成https協議,就能夠讓客戶端瀏覽器輸入普通地址自動跳轉到加密的https的頁面,並且頁面還是後端Tomcat服務提供的功能。
    編輯/etc/httpd/conf/httpd.conf配置文件,下面語句實現將整個Apache站點都自動轉成https協議

# add by sxr
RewriteEngine on
RewriteCond %{SERVER_PORT} 80
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
RewriteLog /var/log/httpd/rewrite.log
RewriteLogLevel 10
保存,重啓Apache服務生效
# /etc/init.d/httpd restart
Stopping httpd:[OK]
Starting httpd:[OK]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章