Tomcat配置自签SSL
1. 准备证书密钥存储库
Tomcat 目前只能操作 JKS
、PKCS11
、PKCS12
格式的密钥存储库。JKS
是 Java 标准的“Java 密钥存储库”格式,是通过 keytool
命令行工具创建的。该工具包含在 JDK 中。PKCS12
格式一种互联网标准,可以通过 OpenSSL 和 Microsoft 的 Key-Manager 来。
密钥存储库中的每一项都通过一个别名字符串来标识。尽管许多密码存储库实现都在处理别名时不区分大小写,但区分大小写的实现也是允许的。比如,PKCS11
规范需要别名是区分大小写的。为了避免别名大小写敏感的问题,不建议使用只有大小写不同的别名。
为了将现有的证书导入 JKS
密码存储库,请查阅关于 keytool
的相关文档(位于 JDK 文档包里)。注意,OpenSSL 经常会在密码前加上易于理解的注释,但 keytool
并不支持这一点。所以如果证书里的密码数据前面有注释的话,在利用 keytool
导入证书前,一定要清除它们。
下面这个实例展示的是如何利用终端命令行,从零开始创建一个新的 JKS
密码存储库,该密码库包含一个自签名的证书。
Windows:
"%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA
Unix:
$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA
(RSA 算法应该作为首选的安全算法,这同样也能保证与其他服务器和组件的大体的兼容性。)
该命令将在用户的主目录下创建一个新文件:.keystore
。要想指定一个不同的位置或文件名,可以在上述的 keytool
命令上添加 -keystore
参数,后跟到达 keystore 文件的完整路径名。你都需要把这个新位置指定到 server.xml
配置文件上,见后文介绍。例如:
Windows:
"%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA
-keystore \path\to\my\keystore
Unix:
$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA
-keystore /path/to/my/keystore
执行该命令后,首先会提示你提供 keystore 的密码。Tomcat 默认使用的密码是 changeit
(全部字母都小写),当然你可以指定一个自定义密码(如果你愿意)。同样,你也需要将这个自定义密码在 server.xml
配置文件内进行指定,稍后再予以详述。
接下来会提示关于证书的一般信息,比如组织、联系人名称,等等。当用户试图在你的应用中访问一个安全页面时,该信息会显示给用户,所以一定要确保所提供的信息与用户所期望看到的内容保持一致。
最后,还需要输入密钥密码(key password),这个密码是这一证书(而不是存储在同一密码存储库文件中的其他证书)的专有密码。keytool
提示会告诉你,如果按下回车键,则自动使用密码存储库 keystore 的密码(建议如此操作)。当然,除了这个密码,你也可以自定义自己的密码。如果选择自定义密码,那么不要忘了在 server.xml
配置文件中指定这一密码。
如果操作全部正常,我们现在就会得到一个服务器能使用的有证书的密码存储库文件。
2. 编辑 Tomcat 配置文件
为了配置使用 JSSE 的 SSL 连接器,你可能需要清除注释并按照如下的方式来编辑它。
<!-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 -->
<Connector
protocol="org.apache.coyote.http11.Http11NioProtocol"
port="8443" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="${user.home}/.keystore" keystorePass="changeit"
clientAuth="false" sslProtocol="TLS"/>
一定要确保对所使用的连接器采用正确的属性。BIO、NIO 以及 NIO2 连接器都使用 JSSE,然而APR以及原生的连接器则使用 APR。
如果在这里,你更改了端口号,那么也应该在 非 SSL 连接器(指的是HTTP和AJP的两个链接器)的 redirectPort 属性值。从而使 Tomcat 能够根据 Servlet 规范,自动对访问带有安全限制(指定需要 SSL)页面的用户进行重定向。
配置完全部信息后,你应该像往常一样,重新启动 Tomcat,从而能够利用 SSL 来访问任何 Tomcat 所支持的 Web 应用了。比如:
https://localhost:8443/