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無法通路的問題,建議使用以下兩個方案:
方案一: 更新 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"/>
方案二: 采用 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/
ProxyPassReverse /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儲存。
2、編輯/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
ProxyPassReverse /test http://192.168.1.10:8080/examples
ProxyPass /docs http://192.168.1.10:8080/docs
#注意,末尾沒有/符号,http://192.168.1.10:8080/docs/是錯誤的
ProxyPassReverse /docs http://192.168.1.10:8080/docs
#注意:轉發到Tomcat的URL中末尾不能加/符号。
Apache 實作ProxyPass轉發URL到Tomcat并實作http自動轉https
寫成ProxyPassReverse /docs
http://192.168.1.10:8080/docs,
3、 配置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]