1.概述
Apache
Tomcat是一款优秀的Java Web容器,对于各个站长来说,可以很方便的使用Tomcat将自己的网站博客放在公网的服务器上,分享自己的心得以及个人博客。
那么在公网中的访问,没有被第三方公认可信的机构加密时,会默认使用Http协议,以明文将自己的网站在公网上传输。这对于大部分领域都没关系,但是对于某些敏感的数据,甚至机密需要保护的数据,例如:银行卡号、银行密码、手机验证码之类的信息,一旦被别有用心的人在中途使用抓包工具拦截,那么将会导致不可设想的后果。
那么网站需要使用SSL(Secure Sockets Layer),顾名思义,安全的套接字层。通过这层提供的保障,在SSL上面运行的应用都可以安全传输
2.获取证书
获取证书可到证书服务商购买证书或,或者使用免费的证书。
免费证书获取方法:获取免费的https证书
3.转换证书格式
由于Tomcat证书不支持直接使用pem,crt + 私钥的方式,因此,需要多一步使用Openssl
将你的证书使用命令转换为jks
crt转jks
openssl pkcs12 -export -out /ssl/tomcat.jks -in /ssl/xxx.crt -inkey /ssl/xxx.key
pem转jks
openssl pkcs12 -export -out /ssl/tomcat.jks -in /ssl/xxx.pem -inkey /ssl/xxx.key
执行命令后会要求为该证书添加密码。请记住该密码。
如果使用不了如上命令,尝试考虑升级Openssl到最新版本
更多证书格式转换请参考:SSL证书格式详解与转换
4.配置 server.xml
编辑server.xml 文件
我的是放在/usr/local/tomcat/conf 下
vim /usr/local/tomcat/conf/server.xml
在Connector中,添加如下Connector
keystoreFile填写之前使用Openssl生成的jks文件,填写的密码。
<Connector
protocol="org.apache.coyote.http11.Http11NioProtocol"
port="443" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="/ssl/tomcat.jks" keystorePass="密码"
clientAuth="false" sslProtocol="TLS"/>
此外,为了将Tomcat监听80端口,并将HTTPS请求转发到443端口(443为SSL默认端口)
8080改为80,8443改为443
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="443" />
修改好,保存退出,重启Tomcat,输入域名
发现要手动加入https:// 才有那把小绿锁
所以如果需要将该域名下的所有访问都走HTTPS加密的话,需要将所有对Tomcat的THHP访问都默认转发给HTTPS的访问,实现不管只输入域名还是https://...都访问的是HTTPS
5.转发Http请求到Https
编辑 web.xml 文件
vim /usr/local/tomcat/conf/web.xml
添加如下代码
<!-- 增加所有网址自动跳转https -->
<security-constraint>
<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>
保存后重启Tomcat
6.启用HSTS
HSTS([HTTP Strict Transport Security])是一种机制,它告诉浏览器只通过HTTPS访问某个域名。要在Tomcat中配置HSTS,可以以下步骤:
- 启用HTTPS连接。这需要配置SSL连接器,并提供证书等。
- 在Tomcat的web.xml中配置HSTS过滤器:
<filter>
<filter-name>HSTSFilter</filter-name>
<filter-class>
org.apache.catalina.filters.HttpHeaderSecurityFilter
</filter-class>
<init-param>
<param-name>hstsEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>hstsMaxAgeSeconds</param-name>
<param-value>31536000</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>HSTSFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
7.使用 http2 配置
这是原有HTTP1.1的 SSL 配置,注释掉
<Connector
protocol="org.apache.coyote.http11.Http11NioProtocol"
port="443" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="/etc/ssl/tomcat.jks" keystorePass="pass123"
clientAuth="false" sslProtocol="TLS"/>
找到以下模块,取消掉注释
<Connector port="443" protocol="org.apache.coyote.http11.Http11AprProtocol"
maxThreads="150" SSLEnabled="true" >
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
<SSLHostConfig>
<Certificate certificateKeyFile="/etc/ssl/tomcat.key"
certificateFile="/etc/ssl/tomcat.crt"
type="RSA" />
</SSLHostConfig>
</Connector>
8.禁用TLS1.0 1.1 只使用 TLS1.2 1.3
在<SSLHostConfig>
框里输入SSLVerifyClient="optional" Protocols="TLSv1.2+TLSv1.3"
<Connector port="443" protocol="org.apache.coyote.http11.Http11AprProtocol"
maxThreads="150" SSLEnabled="true" >
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
<SSLHostConfig SSLVerifyClient="optional" Protocols="TLSv1.2+TLSv1.3">
<Certificate certificateKeyFile="/etc/ssl/tomcat.key"
certificateFile="/etc/ssl/tomcat.crt"
certificateChainFile="/etc/ssl/tomcat.ca.crt"
type="RSA" />
</SSLHostConfig>
</Connector>
验证输入都是显示NONE就代表已经关闭了TLS1.1
openssl s_client -connect 域名:443 -tls1 < /dev/null
9.绑定多域名。禁止本机IP访问
经测试Engine name="Catalina" defaultHost="localhost"这个不用修改 默认localhost
就好
找到 <Host name= 多复制一份。
<Host name="域名.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<Host name="www.域名.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
之后就不能用IP访问 网站了,只能用域名。
10.访问测试
在浏览器输入域名发现直接跳转成HTTPS了
参考文章:https://www.cnblogs.com/letcafe/p/tomcatAddHttps.html