为Tomcat启用Https连接支持

EdmLHV 8年前

来自: 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版本。