HTTPS加密套件的笔记

本文于2016年5月份完成,发布在个人博客网站上。 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来。


按照如下配置(适用于Tomcat 7.0.x),为Tomcat启用了HTTPS协议,用户访问站点时是否就安全了呢?

<!-- HTTP通道,跳转至8443端口 -->
<Connector port="8080" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" 
/>
<!-- HTTPS通道 -->
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
	connectionTimeout="20000"
	URIEncoding="UTF-8"
	SSLEnabled="true"
	secure="true"
	scheme="https"
	clientAuth="false"
	keystoreFile="conf/tomcat.key"
	keyPass="changeit"
	keystorePass="changeit"
>
</Connector>

原来还真不是。

文章SSL/TLS Deployment Best Practices中有如下描述:

SSL/TLS is a deceptively simple technology. It is easy to deploy, and it just works . . . except that it does not, really.The first part is true—SSL is easy to deploy—but it turns out that it is not easy to deploy correctly.

近日收到我厂发布的安全预警,要求对于我厂自研的网元:

  • 网元之间使用ssh协议交互时,需要禁用不安全的协议,如SSL2.0、SSL3.0、TLS1.0;
  • 网元使用ssh协议向外部开放服务时,默认情况下需要禁用不安全的协议;
  • 使用自签名证书时,RSA算法的密钥长度至少为2048,并且签名算法应选择SHA256withRSA;
  • cipher suite应避免使用RC4、3DES等不安全算法,同时禁用CBC模式;
  • 。。。

但是,没看明白。预警中提到了太多的名词,但限于篇幅,没有为名词提供更多的解释。不过预警的详细信息中建议搜索关键词如cipher suite,了解相关的信息,便于进一步的分析和整改。

结果找到了Hardening Your Web Server’s SSL Ciphers,一篇很给力的文章,提到了如下的加固步骤:

If you configure a web server’s TLS configuration, you have primarily to take care of three things:

  1. disable SSL 2.0 (FUBAR) and SSL 3.01 (POODLE),
  2. disable TLS 1.0 compression (CRIME),
  3. disable weak ciphers (DES, RC4), prefer modern ciphers (AES), modes (GCM), and protocols (TLS 1.2).

另外从平台部门同事那边也获取到一份资料,名为《Web安全加固最佳实践》,内容也很强大。虽然没看完全看明白,但确认预警是足够了。

对于Web应用来说,安全协议和套件的配置取决于运行Tomcat的JDK、Tomcat自身、客户使用的浏览器。考虑项目当前的情况以及浏览器兼容性,从前述三个维度进行分析:

  • 项目当前使用了JDK 8U65版本,支持TLS1.2;
  • 项目当前使用的是平台部门加固过的Tomcat,支持TLS1.2;
  • 项目需要兼容IE8、IE9、IE11,所以CBC相关的cipher suite还得保留;

最终加固后的Tomcat配置样例如下:

<!-- HTTPS通道 -->
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
	connectionTimeout="20000"
	URIEncoding="UTF-8"
	SSLEnabled="true"
	secure="true"
	scheme="https"
	clientAuth="false"
	keystoreFile="conf/tomcat.key"
	keyPass="changeit"
	keystorePass="changeit"
	sslProtocol="TLS"
    sslEnabledProtocols="TLSv1.2,TLSv1.1"
    ciphers="TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"
>
</Connector>

如上仅是样例,并不是最佳实践。项目实际使用时,在$CATALINA_BASE/conf/catalina.properties中定义配置项,然后在$CATALINA_BASE/conf/server.xml中引用前述配置项,便于脚本读取、替换这些配置项的取值。

资料

TLS协议

Web加固

Tomcat

如下资料介绍如何对Apache Tomcat进行加固。

openssl

如下资料介绍了openssl支持的加密套件,以及相关的材料。

JDK支持的cipher suites

如下分别来自IBM和Oracle,介绍了各自JDK支持的cipher suite。

其它资料

其它

使用浏览器访问poodle.io时,站点会给出浏览器是否使用SSLv3协议的提示,如下:

Good News! Your browser does not support SSLv3.

www.howsmyssl.com大致类似,也可以对浏览器进行检测,但提供的信息更多。

热门相关:万道龙皇   娶一送一:爹地,放开我妈咪!   唐枭   写给鼹鼠先生的情书   贴身侍卫