Web服务器启用HTTPS的配置方法

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


nginx的配置方法

可以参考Jerry Qu的本博客 Nginx 配置之完整篇

Tomcat的配置方法

以Java语言实现的Connector为例,介绍配置方法。

创建证书

  • Windows下,可以在CMD下执行命令

      "%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA -keystore tomcat.key
    
  • Unix下,可以在shell下执行命令

      $JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA -keystore tomcat.key
    

keytool提示输入口令时,输入changeit;然后按照要求输入其它信息,证书信息会生成到tomcat.key文件中。

注意,这里输入的口令可以不是changeit,但具体值需要和Connector配置中的keyPasskeystorePass保持一致,否则Tomcat启动后会报错提示无法加载证书文件。

关于证书,这是一个很大的话题,涉及范围很广,而Jackie其实一直以来并没有搞的很清楚,所以此处就不献丑了。

配置Connector

对于Apache Tomcat的7.0.X版本,修改$CATALINA_BASE/conf/server.xml中定义的Connector,增加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>

对于Apache Tomcat的9.0.X版本,与7.0.x版本的配置方法稍有不同,但同样需要修改$CATALINA_BASE/conf/server.xml中定义的Connector,样例如下:

<!-- 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"
    scheme="https" 
    secure="true" 
    >
    <SSLHostConfig>
        <Certificate certificateKeystoreFile="conf/tomcat.key"
        	certificateValidation="false"
        	certificateKeyPassword="changeit"
        	certificateKeystorePassword="changeit"
            type="RSA" 
        />
    </SSLHostConfig>
</Connector>

样例中配置了明文的口令,显然并不安全,存在安全上的漏洞。

解决的方法如下:

  1. 使用安全且可逆的加密算法生成密文;
  2. 修改tomcat相关的源码,使用加密算法还原得到明文,然后使用明文来加载证书。

过程并不复杂,可以参考tomcat安全配置之证书密码加密存储

配置应用

修改应用的web.xml文件,增加如下配置

<session-config>
	<cookie-config>
		<!-- <http-only>true</http-only> --> <!-- 设置Cookie对浏览器加载的脚本不可见,默认值为true,因此无需配置 -->
		<secure>true</secure> <!-- 设置Cookie使用HTTPS方式传递 -->
	</cookie-config>
<session-config>
<security-constraint>
    <web-resource-collection>
        <web-resource-name>SSL</web-resource-name>
        <url-pattern>/*</url-pattern> <!-- 对于应用的所有URL都要求使用HTTPS方式访问 -->
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

当然可以依据实际情况调整样例中对URL的控制范围。

官网的参考资料

关于HTTPS的阅读材料

百度的HTTPS实践

百度目前已实现全站启用HTTPS,来自百度运维部主页的如下文章记录了百度技术人员的实践经验,非常值得一读。

Jerry Qu的分享

Jerry Qu的博客是一个好地方,有很多前端的资料,值得拜读。

其它资料

热门相关:扑倒老公大人   扑倒老公大人   都市极品小医圣   诛天至极   魔葫