使用 JDK 自带的工具 keytool 生成受信任的证书实现 tomcat 的 https 访问

495 阅读3分钟

一、基础环境

操作系统:Windows 或 Linux

JDK 版本:1.8.0_191 (64位)

tomcat 版本:8.5.35 (64位)

二、解决问题

在开发环境或只有内网的生产环境中,没有域名和公网 IP 的情况下,无法向 CA 机构申请 SSL 证书,我们可以使用 JDK 自带的工具 keytool 生成证书来实现 tomcat 的的 https 访问。

三、操作步骤

1、将 tomcat 启动,看是否能够正常运行。

tomcat-http运行图.png 2、打开命令提示符或shell 执行以下命令:

keytool -genkeypair -alias tomcat -keyalg RSA -validity 3650 -keypass 123456 -keystore D:\tomcat.keystore -ext SAN=ip:192.168.40.65

命令的参数含义:

参数名称参数说明
-genkeypair生成密钥对
-alias要处理的条目的别名
-keyalg密钥算法名称
-validity有效天数
-keypass密钥口令
-keystore密钥库名称,即存放位置
-extX.509 扩展

3、输入命令后会弹出以下提示,按照提示操作即可。

keytool生成证书过程.png 设置密钥库的口令,一般可以设置为:123456 。您的名字与姓氏是什么?这里需要输入用户访问的地址,如果地址做了映射,需要输入映射之后的地址,如果没有映射,输入服务器地址即可。其他地方可以按照实际情况填写,也可以留空直接按回车。最后弹出一个警告和一行命令,将命令复制出来,直接执行即可。

4、输入命令后会弹出以下提示,按照提示操作即可。

导入证书.png 输入源密钥库的口令后,程序自动完成迁移。

5、使用以下命令导出证书,会生成一个 cer 文件。

keytool -exportcert -rfc -alias tomcat -file D:\tomcat.cer -keystore D:\tomcat.keystore -storepass 123456

命令的参数含义:

参数名称参数说明
-exportcert导出证书
-rfc以 RFC 样式输出
-alias要处理的条目的别名
-file输出文件名
-keystore密钥库名称
-storepass密钥库口令

6、导入到 JRE 证书库,其中 %JAVA_HOME% 为 tomcat 使用的 JDK的 JAVA_HOME,最后输入 Y 按回车。

keytool -import -trustcacerts -alias tomcat -file D:\tomcat.cer -keystore %JAVA_HOME%\jre\lib\security\cacerts -storepass changeit

命令的参数含义:

参数名称参数说明
-import导入证书或证书链
-trustcacerts信任来自 cacerts 的证书
-alias要处理的条目的别名
-file输入文件名
-keystore密钥库名称
-storepass密钥库口令 (默认为changeit)

7、将生成 tomcat.keystore 复制到 tomcat 的 conf 目录下。

8、配置 tomcat/conf/server.xml 将下面的内容

<!--
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
               maxThreads="150" SSLEnabled="true" >
        <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
        <SSLHostConfig>
            <Certificate certificateKeyFile="conf/localhost-rsa-key.pem"
                         certificateFile="conf/localhost-rsa-cert.pem"
                         certificateChainFile="conf/localhost-rsa-chain.pem"
                         type="RSA" />
        </SSLHostConfig>
    </Connector>
 -->

替换为:

<Connector port="8443" protocol="HTTP/1.1"
           maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
		   clientAuth="false" sslProtocol="TLS" 
		   keystoreFile="conf/tomcat.keystore"
		   keystorePass="123456" >
</Connector>

8、导入证书。找到生成 tomcat.cer 然后双击该证书,然后点击【安装证书】,点击【下一步】,【存储位置】选择【本地计算机】,点击【下一步】,选中【将所有的证书都放入下列存储】,然后单击【浏览】,选择【受信任的根证书颁发机构】,然后点击【确定】,点击【下一步】,点击【完成】。然后弹出提示【导入完成】。

9、重新启动 tomcat ,待启动完成后,打开 IE 浏览器,输入https://192.168.40.65:8443/ 即可通过 https 访问tomcat。

tomcat-https运行图.png 10、我们希望访问 http 地址,tomcat 自动 跳转到 https。打开tomcat/conf/web.xml 在 与 加入如下代码:

<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> 

保存后,重新启动tomcat 即可实现在地址栏中可以直接输入地址 “http” 会自动跳转成为 “https://” 。

11、如果想只输入 IP 地址,不加端口号直接访问服务的话。可以将端口号 8080 修改成 HTTP 协议的默认端口号 80。把端口号 8443 修改成 HTTPS 协议的端口号 443 即可。

参考资料:

1、blog.csdn.net/oicqxiesidi…

2、www.cnblogs.com/luchangyou/…