为Tomcat启用Https连接支持
来自: http://my.oschina.net/songxinqiang/blog/611535
现在web应用使用https方式进行访问是很普遍的了,今天才发了一个新闻:Chrome力推HTTPS:HTTP网站被标注为不安全。所以说,为自己的网站添加SSL的连接支持刻不容缓啊,本文就来说一下Tomcat的SSL连接支持。
本文的说明使用“第三方”给的证书,所以不涉及证书制作,使用APR引擎,所以需要安装APR以及tomcat-native,参考tomcat官方文档。
0、环境准备
本文基于linux系统上的tomcat-8.0.30,已经安装好了apr以及tomcat-native,关于apr以及tomcat-native的安装参考我的另一篇博客:为Linux上的Tomcat安装apr支持。
1、证书
虽然说可以使用jdk自带工具制作证书,网上(包括tomcat官方文档的大部分)都有很多说明,但是这样的证书是不符合真实环境的,真实的环境是由“第三方”的机构进行证书颁发,否则每次都会提示证书不受信,而且在地址栏前面还会有看起来像出错的提示。
所以,我们这里直接使用由“第三方”颁发的证书,证书有两个文件:公钥和私钥。具体的文件名取决于证书的具体算法、类型什么的,反正是两个文件。
这里我得到的证书的公钥文件名为“serversert.pem”,私钥文件名为“serverkey.pem”,其实可以重命名一下,但是我也就不重命名了。将这两个文件放到目录“/etc/ssl”里面,要是放到其他目录也行,待会儿的配置路径对应修改就是。
2、配置文件conf/server.xml
首先需要修改“<tomcat-dir>/conf/server.xml”文件,在默认的文件的基础上,将默认的
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
修改为
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="443" />
然后将默认添加了注释的
<!-- <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" /> -->
去掉注释,并修改为
<Connector port="443" protocol="org.apache.coyote.http11.Http11AprProtocol" maxThreads="200" SSLEnabled="true" scheme="https" secure="true" SSLCertificateFile="/etc/ssl/serversert.pem" SSLCertificateKeyFile="/etc/ssl/serverkey.pem" SSLVerifyClient="optional" SSLProtocol="TLSv1+TLSv1.1+TLSv1.2" />
紧接着这个的下面,将
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
修改为
<Connector port="8009" protocol="AJP/1.3" redirectPort="443" />
这样实际上已经开启了https的支持的了,但是还没有实现对http连接到https的跳转的,需要将http(80端口)的连接跳转到https(443端口)还需要下面的配置。
3、配置文件conf/web.xml
修改“<tomcat-dir>/conf/web.xml”文件,在文件最后
</welcome-file-list> </web-app>
在这中间加入配置,使之成为
</welcome-file-list> <!-- SSL --> <login-config> <!-- Authorization setting for SSL --> <auth-method>CLIENT-CERT</auth-method> <realm-name>Client Cert Users-only Area</realm-name> </login-config> <security-constraint> <!-- Authorization setting for SSL --> <web-resource-collection> <web-resource-name >SSL</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint> </web-app>
至此,配置完成!
4、补充
配置完成之后,启动服务器,使用“http://<host>”不指定端口访问服务器,正确情况下,应该自动跳转到"https://<host>",相当于会自动从80跳转到443端口,这都是http和https的默认端口,如果需要其他端口,配置的时候指定梁歪的端口即可。
server.xml里面连接协议需要系统的OpenSSL库支持对应的协议才行,我实验的时候在一台OpenSSL库为“0.9.8.e”版本的时候就只能使用TLSv1版本。