我花了一个下午才弄清楚这个确切的问题,所以我将在这里分享我的过程。
以下每个参考资料都提供了有关如何生成和使用自签名证书的说明。这并不是我想要做的,但这些都包含一些有用的背景信息。
参考:
我已经为 *.jimtough.org 'wildcard' 域购买了真正的 CA 颁发的 SSL 证书。我从http://www.namecheap.com/ 购买了证书,但实际的证书颁发机构 (CA) 是 Comodo。
作为 CA 购买/激活程序的一部分,我需要遵循以下说明:
请注意,我之所以选择遵循他们的 AWS 说明,是因为我是 AWS 用户,并且拥有一个随时可用的 EC2 服务器,并且服务器上已经安装了 OpenSSL 和 Java。有许多其他替代方法可以执行相同的过程,因此请进一步搜索以找到适合您的“生成 CSR”说明。
在这一步结束时,我有以下两个文件:
-
csr.pem - 这用作 SSL 证书请求/激活过程的一部分
-
private.key - 这是我的 SSL 证书的私钥部分,稍后我需要在我的服务器上安装证书。 保密。请妥善保管。
在我完成 SSL 证书的购买和验证程序后,CA 向我发回了一个 .zip 文件,其中包含一个 .p7b、.crt 和 .ca-bundle 文件。
以下参考链接之一解释了这些证书文件类型之间的区别:
-
.p7b - 此类型应与基于 Java 的应用程序兼容(PKCS#7 格式)
-
.crt - 这种类型应该与大多数其他东西兼容 - 上面的链接表明这是 PEM 格式
-
.ca-bundle - 不确定何时使用 - 上面的链接表明这是 PEM 格式
参考:
接下来,我需要弄清楚如何使用上面列出的文件来为我的 Spring Boot 应用程序配置 HTTPS。
我将按照以下教程的相关部分来获得我需要的东西:
注意:在这两个教程中,我不会按照他们关于创建自签名证书的部分进行操作,因为我已经拥有由真实 CA 颁发的真实证书。
他们的说明中的第一个相关步骤是创建一个新的 Java 密钥库。要求是:
- 必须安装 Java,所以我可以访问“keytool”实用程序
- 必须安装“openssl”实用程序,这样我才能使用我的 .key 和 .p7b 文件作为输入创建一个 .p12 文件
我将使用我的 AWS EC2 Linux 服务器来执行此操作。我的服务器已经安装了 Java/keytool 和 OpenSSL 实用程序。
首先,我需要使用 OpenSSL 实用程序创建一个 .p12 文件(如果我理解正确的话)将包含我的
私钥和 CA 颁发的证书。其次,我需要创建一个新的 Java 密钥库,其中包含一个导入的
.p12 文件的副本。
-
openssl pkcs12 -export -out jimtough-dot-org.p12 -name "jimtough-dot-org" -inkey private.key -in __jimtough_org.crt
- 重要提示:需要在“导出密码”提示处提供密码,否则下一步keytool导入会失败
-
keytool -importkeystore -srckeystore jimtough-dot-org.p12 -srcstoretype PKCS12 -destkeystore jimtough-dot-org-keystore.jks -deststoretype JKS
- 您需要提供在“openssl”命令中使用的密码
- 您还需要为正在创建的密钥库提供新密码
- (可选)
keytool -importkeystore -srckeystore jimtough-dot-org-keystore.jks -destkeystore jimtough-dot-org-keystore.pkcs12 -deststoretype pkcs12
- 我收到了来自“keytool”的关于 JKS 是一种专有格式的警告,并建议我将我的密钥库转换为 PKCS12 格式,所以我使用这个可选命令这样做了
最后,我需要将我新创建的 Java 密钥库与我的 Spring Boot 应用程序打包并配置应用程序以使用它。
参考:
我参考了上面的两个 Baeldung 教程,并且能够获得使我的 Spring Boot(启用 Spring Security)工作所需的详细信息。
我在现有的 'src/main/resources' 下创建了一个新的 'keystore' 文件夹,并将我新创建的两个密钥库文件都复制到那里(我保留了这两种格式)。
我将下面的块添加到我的 Spring Boot 应用程序的 application.properties 文件中。
#--------------------------------------------------------------------------------------------------
# SSL CONFIGURATION
# The format used for the keystore. It could be set to JKS in case it is a JKS file
#server.ssl.key-store-type=JKS
server.ssl.key-store-type=PKCS12
# The path to the keystore containing the certificate
#server.ssl.key-store=classpath:keystore/jimtough-dot-org-keystore.jks
server.ssl.key-store=classpath:keystore/jimtough-dot-org-keystore.pkcs12
server.ssl.key-store-password=mykeystorepassword
server.ssl.key-alias=jimtough-dot-org
server.ssl.enabled=true
server.port=8443
#--------------------------------------------------------------------------------------------------
正如预期的那样,当我尝试使用 https://localhost:8443/ 作为 URL 连接到本地运行的 Spring Boot 应用程序实例时,我从浏览器中收到了一堆警告。发生这种情况是因为浏览器正确识别了“localhost”与创建我的 SSL 证书以在其上运行的预期“jimtough.org”域之间的不匹配。当我将应用程序部署到主机名为“anything.jimtough.org”(或只是www.jimtough.org)的服务器时,不应出现任何警告。
就是这样! HTTPS 快乐!