如何创建用于 Tomcat 的自签名 SSL 证书?

How to create a self signed SSL certificate for use with Tomcat?

我想生成一个自签名 SSL 证书,并将其与 Tomcat 一起使用。

我该怎么做?

如果您想生成一个用于开发目的的 SSL 证书,以便与 tomcat 一起使用,您可以使用这个衬垫来完成(需要在您的机器上使用 JDK,所以这不使用 openssl) .

keytool -genkey -keyalg RSA -noprompt -alias tomcat -dname "CN=localhost, OU=NA, O=NA, L=NA, S=NA, C=NA" -keystore keystore.jks -validity 9999 -storepass changeme -keypass changeme

这将生成一个 keystore.jks 文件,密码为 changeme,使用 tomcatkeyAlias,有效期为 localhost[=22 的 9999 天=]

在您的 tomcat/conf/server.xml 中,您需要像在 <Connector>

中那样指定它
    keyAlias="tomcat"
    keystoreFile="/path/to/my/keystore.jks"
    keystorePass="changeme"

因为 Tomcat 8

根据the documentation

NIO and NIO2 SSL configuration attributes have been deprecated in favor of the default SSLHostConfig

这意味着上面的值现在应该作为 connector/SSLHostConfig/Certificate 的属性,名称如下:

    certificateKeyAlias="tomcat"
    certificateKeystoreFile="/path/to/my/keystore.jks"
    certificateKeystorePassword="changeme"

生成自签名 SSL 证书并添加到 JAVA 信任库以便与 Tomcat

一起使用
  1. 运行生成SSL证书的命令如下

    keytool -genkey -keyalg RSA -alias tomcat -keystore selfsigned.jks -validity 365 -keysize 2048

    • 其中,365表示证书有效的天数。

    • 以上命令导出证书,别名为tomcat.

    • selfsigned.jks 是密钥存储文件。

  2. 输入密钥库的密码。请记下此密码,因为您需要使用此密码来配置服务器。

By default, the key store password is set to changeit; you can use the Key Tool utility’s -storepasswd option to change it to something more secure.

  1. 当提示输入名字和姓氏时,输入服务器的域名。例如,myserver 或 myserver.mycompany.com

  2. 输入其他详细信息,例如组织单位、组织、城市、州和国家/地区。

  3. 确认输入的信息正确无误

  4. 当系统提示 "Enter key" 密码 tomcat 时,按 Enter 以使用与密钥库密码相同的密码。

  5. 运行此命令验证密钥库的内容。

    keytool -list -v -keystore selfsigned.jks

    • 密钥工具实用程序的 -list 选项列出指定密钥存储文件的内容。

    • -v 选项告诉密钥工具实用程序以人类可读的形式显示证书指纹。

  6. 出现提示时,输入在步骤2中记下的密钥库密码。将显示有关生成的证书的基本信息。

  7. 验证证书的指纹。 (验证 "Owner" 和 "Issuer" 是否相同。此外,您应该会看到您在第 3 步和第 4 步中提供的信息) 除非指纹匹配,否则不要接受证书并将其安装在应用程序的信任库中。

  8. 使用密钥工具实用程序的 -export 选项将证书从密钥库导出到单独的证书文件,然后您可以从中将其导入您的应用程序的信任库。 例如,以下命令将上面显示的别名为 tomcat 的证书从密钥库 (selfsigned.jks) 导出到名为 selfsigned.cer 的证书文件:

    keytool -export -keystore selfsigned.jks -storepass <password> -alias tomcat -file selfsigned.cer

    • password为keystore密码,输入步骤2记下的keystore密码

    • Key Tool 实用程序响应以下输出

      证书存储在文件selfsigned.cer

  9. 验证证书文件的内容。

    • 您可以仔细检查证书文件的内容以确保它包含正确的证书。

    • 密钥工具实用程序的 -printcert 选项列出指定证书文件的内容。例如,以下命令列出了在上一步中创建的证书文件 selfsigned.cer:

      keytool -printcert -v -file selfsigned.cer

    • 再一次,-v 选项告诉密钥工具实用程序以人类可读的形式显示证书的指纹。

    • 检查 keytool -printcert 命令的输出以确保证书正确。

  10. 如果您的应用程序的信任库中存在过期证书,则必须使用以下步骤将其删除,否则直接跳至下一步 13 以导入证书。


从 JAVA 信任库中删除 SSL 证书并将其删除。

  • 运行 以下命令从 JAVA 信任库中删除证书。

    keytool -delete -noprompt -trustcacerts -alias tomcat -file selfsigned.cer -keystore "$JAVA_HOME/jre/lib/security/cacerts"

  • 出现提示时,输入密码(默认密码为changeit

  • 运行 以下命令确认证书是否从 JAVA 信任库中删除。

    keytool -list -keystore "$JAVA_HOME/jre/lib/security/cacerts" | grep tomcat

  • 出现提示时,输入密码(默认密码为changeit

  • 运行以下命令从系统中删除证书文件。

    rm -f selfsigned.cer

    从密钥库中删除 SSL 证书并将其删除。

  • 运行 以下命令从密钥库中删除证书。

    keytool -delete -noprompt -trustcacerts -alias tomcat -keystore selfsigned.jks

  • 密钥工具实用程序提示您输入密钥库文件的密码:

    输入密钥库密码:

  • 运行 以下命令确认证书是否从密钥库中删除。

    keytool -list -keystore keytool -list -keystore selfsigned.jks | grep tomcat

  • 密钥工具实用程序提示您输入密钥库文件的密码:

    输入密钥库密码:

  • 运行以下命令从系统中删除密钥存储文件。

    rm -f selfsigned.jks


  1. 将证书导入应用程序的信任库。密钥工具实用程序的 -import 选项从指定信任库中的证书文件安装证书。

    • 例如,如果您的客户端应用程序的信任库保存在文件 $JAVA_HOME/jre/lib/security/cacerts 中,以下命令将从上面创建的文件 selfsigned.cer:

      keytool -import -noprompt -trustcacerts -alias tomcat -file selfsigned.cer -keystore "$JAVA_HOME/jre/lib/security/cacerts" -storepass changeit

    • 密钥工具实用程序响应以下输出:

      证书已添加到密钥库

证书现已完成,Apache Tomcat服务器可以使用了。

  1. 在tomcatserver.xml中,在文件中寻找Connector标签,添加密钥库文件路径及其密码。请参考以下配置。

    <Connector port="8080" protocol="HTTP/1.1"
               redirectPort="443"
               disableUploadTimeout="false"/>
    <Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
              maxThreads="150" scheme="https" secure="true"
              keystoreFile="selfsigned.jks" keystorePass="<password>"
              clientAuth="false" acceptCount="100"/>
    

如果 Tomcat 是服务器,则不应编辑 trustore 仅适用于密钥库