一、基础环境
操作系统:Windows 或 Linux
JDK 版本:1.8.0_191 (64位)
tomcat 版本:8.5.35 (64位)
二、解决问题
在开发环境或只有内网的生产环境中,没有域名和公网 IP 的情况下,无法向 CA 机构申请 SSL 证书,我们可以使用 JDK 自带的工具 keytool 生成证书来实现 tomcat 的的 https 访问。
三、操作步骤
1、将 tomcat 启动,看是否能够正常运行。
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 | 密钥库名称,即存放位置 |
-ext | X.509 扩展 |
3、输入命令后会弹出以下提示,按照提示操作即可。
设置密钥库的口令,一般可以设置为:123456 。您的名字与姓氏是什么?这里需要输入用户访问的地址,如果地址做了映射,需要输入映射之后的地址,如果没有映射,输入服务器地址即可。其他地方可以按照实际情况填写,也可以留空直接按回车。最后弹出一个警告和一行命令,将命令复制出来,直接执行即可。
4、输入命令后会弹出以下提示,按照提示操作即可。
输入源密钥库的口令后,程序自动完成迁移。
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。
10、我们希望访问 http 地址,tomcat 自动 跳转到 https。打开tomcat/conf/web.xml 在 </welcome-file-list> 与 </web-app> 加入如下代码:
<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、https://blog.csdn.net/oicqxiesidilieric/article/details/8464834