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无法访问的问题,建议使用以下两个方案:

方案一: 升级 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]
上一篇:快,好,省 - HBR使用OSS清单进行OSS备份


下一篇:注意:SSL证书最长有效期已缩短至一年