Tomcat9使用Https证书加密网站

1.概述

Apache
Tomcat是一款优秀的Java Web容器,对于各个站长来说,可以很方便的使用Tomcat将自己的网站博客放在公网的服务器上,分享自己的心得以及个人博客。

image.png

那么在公网中的访问,没有被第三方公认可信的机构加密时,会默认使用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,可以以下步骤:

  1. 启用HTTPS连接。这需要配置SSL连接器,并提供证书等。
  2. 在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

QQ截图20220930175122.png

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 &quot;%r&quot; %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 &quot;%r&quot; %s %b" />

      </Host>

之后就不能用IP访问 网站了,只能用域名。

10.访问测试

在浏览器输入域名发现直接跳转成HTTPS了

参考文章:https://www.cnblogs.com/letcafe/p/tomcatAddHttps.html

# tomcat 

本文由:星际难民
实践,测试,整理发布.如需转载请注明地址 本文标题:Tomcat9使用Https证书加密网站
地址:https://530503.xyz/articles/2020/11/25/1606293443682.html

评论

取消