将 .crt 添加到 Spring Boot 以启用 SSL

Posted

技术标签:

【中文标题】将 .crt 添加到 Spring Boot 以启用 SSL【英文标题】:Adding .crt to Spring Boot to enable SSL 【发布时间】:2018-03-22 01:20:42 【问题描述】:

我以前从未这样做过,大多数教程都没有提到如何处理 .crt 文件。

我从 GoDaddy 购买了 SSL 证书,下载时选择了 Tomcat 作为平台。 zip 文件包含 3 个文件:

dea08asdjakjawl.crt  
gd_bundle-g1-g1.crt  
gdig.crt.pem  

我在 CentOS7 服务器上有一个正在运行的 Spring Boot 应用程序(在端口 80 上带有嵌入式 Tomcat)。 (服务器在 Digital Ocean 上运行,它有一个分配的域,并且使用简单的 http)

我想换成https://something.com

所有教程都建议我必须有一个 .jks 或 .p12 文件,但我无法将 .crt 文件转换为那个文件。除此之外,我不确定 2 个 .crt 文件中的哪一个是我应该转换为 .jks/.p12 的文件。

我已将此添加到我的 application.yaml,但没有帮助:

server:    
  port: 443  
  ssl:  
    enabled: true  
    key-alias: server  
    key-store: "cert.crt"  
    key-store-password: "***"  

如何更改正在运行的 Spring Boot 项目以使用此证书接受 HTTPS 查询?

【问题讨论】:

【参考方案1】:

如果使用 Java,则使用 keytool 命令使用 -keystore 参数生成私钥和 CSR。我承认我不知道是否以及如何将现有的导入密钥库(keytool 允许导入证书),但可能有办法。

在最坏的情况下,使用密钥工具重新生成 CSR 并再次重新生成 SSL/TLS 证书 - 这应该不会产生额外费用。

【讨论】:

我可以将 .crt 文件导入新的密钥库,但我应该将 2 个证书中的哪一个导入那里?如果密钥库是全新的,会不会有问题?如何从中制作 .p12 文件?【参考方案2】:

你需要创建一个keystore和一个trusstore(或者使用java提供的默认trusstore)。密钥库将包含您的私钥和服务器证书。 truststore 将包含您的 ca 证书。 创建 p12 密钥库-

openssl pkcs12 -export -in [path/to/certificate] -inkey [path/to/privatekey] -certfile [path/to/ca/certificate ] -out keystore.p12

输入密钥库的密码。在您的 application.yaml 中配置此密钥库。

对于信任库条目,如果使用 java 的默认信任库,则将您的 ca 证书添加到 ...jre/lib/security/cacerts

keytool -import -trustcacerts -alias root -file ca.crt -keystore cacerts

或者您可以创建信任库,然后在您的 application.yaml 中配置此信任库

您可以在互联网上轻松找到所有用于转换/创建/导入/导出/列表的 keytool 命令...

提供了 3 个文件,您可以检查哪个是哪个 - 1.应该是你的证书 2.应该是ca证书链

【讨论】:

我的私钥(密钥库需要)是 .pem 文件吗?通过“在您的 application.yaml 中配置此密钥库”您的意思是我应该获取导出的 .p12 文件并在 .yaml 文件而不是 .crt 文件中定义它的位置?谢谢 可以是pem或pkcs格式,你需要检查哪个是你的私钥。如果您将 csr 发送到 GoDaddy 以创建证书,那么您必须已经创建了私钥。如果 godaddy 也在创建您的密钥,那么他们一定已经为您提供了。 pem 私钥以 -----BEGIN PRIVATE KEY 开头,因此您可以在文本编辑器中打开文件并检查。如果文件是 pkcs 格式,那么您可以使用 openssl 命令读取或使用 openssl 将它们转换为 pem。是的,需要用p12或者jks keystore/trustore代替直接crt文件 能否请您告诉我服务器和ca证书之间的区别。我向 CA 发出了 csr,并收到了一个 .crt(只有一个)文件,该文件的公钥与我的 csr 中的相同。 在使用 openssl 命令添加 -name 参数时,我还要补充一点。这等同于密钥库文件中的别名。所以完整的命令是openssl pkcs12 -export -in [path/to/certificate] -inkey [path/to/privatekey] -certfile [path/to/ca/certificate ] -out keystore.p12 -name [alias-name]【参考方案3】:

所以正确的程序如下:

我不得不使用 Java 密钥库从头开始重新创建 CSR。

keytool -genkey -alias mydomain -keyalg RSA -keystore KeyStore.jks -keysize 2048

然后是一个新的 CSR:

keytool -certreq -alias mydomain -keystore KeyStore.jks -file mydomain.csr

必须将其重新发送给证书提供者以生成新的 .cer 文件。所以他们给我发回了上面提到的 2 个 .cer 文件,“捆绑”一个是中间 .cer,我需要像这样添加:

keytool -import -trustcacerts -alias intermediate -file intermediate.crt -keystore KeyStore.jks

然后是这样的实际“长名称” .cer 文件:

keytool -import -trustcacerts -alias mydomain -file mydomain.crt -keystore KeyStore.jks

那么这是可以像这样转换为 p12 的东西:

 keytool -importkeystore -srckeystore <MY_KEYSTORE.jks> -destkeystore <MY_FILE.p12> -srcstoretype JKS -deststoretype PKCS12 -deststorepass <PASSWORD_PKCS12> -srcalias <ALIAS_SRC> -destalias <ALIAS_DEST>

最后 application.properties 需要额外的行,变成了这样:

server.port=443
server.ssl.enabled=true
security.require-ssl=true
server.ssl.key-store=keystore.p12
server.ssl.key-store-password=password
server.ssl.key-alias=domain
server.ssl.key-password=password

它终于起作用了。

【讨论】:

您好,当我启动应用程序时出现以下异常,java.lang.IllegalArgumentException: java.io.IOException: DerInputStream.getLength(): lengthTag=109, too big。有什么建议吗? 第三步使用intermediate.crt 它没有生成。 Error :- keytool error: java.io.FileNotFoundException: intermediate.crt (系统找不到指定的文件) 嗨, 和 应该是什么。我假设 应该与上一步中创建的别名之一相关。 对我来说,还需要从 p12 中提取私有密钥:openssl pkcs12 -in keystore.p12 -nodes -nocerts -out key.pem【参考方案4】:

如果你想将 Openssl 添加到 Spring Boot 中。

如果您已经安装了 openssl 软件,请按照以下步骤操作。 //创建密钥和公共证书

openssl req -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 365 -out certificate.pem

//测试

openssl x509 -text -noout -in certificate.pem

//结合密钥和公共证书

openssl pkcs12 -inkey key.pem -in certificate.pem -export -out certificate.p12

//测试 openssl pkcs12 -in certificate.p12 -noout -info

在 Spring Boot 属性中添加如下

server.ssl.enabled=true
server.ssl.key-store-type=PKCS12
# The path to the keystore containing the certificate
server.ssl.key-store=classpath:certificate.p12
# The password used to generate the certificate
server.ssl.key-store-password=password

reference

【讨论】:

【参考方案5】:

我之前在使用 Spring Boot 时遇到过这个问题。证书颁发机构向我发送了一个文件夹,其中包含:

domain-name.crt(针对域名生成的证书文件) bundle.crt(包含 CA 根证书和/或中间证书 reference。有关 CA 根证书和中间证书 click here 的详细信息。

Spring Boot 只能理解 .JKS / PKCS12 中的证书文件。我们需要将 .CRT 文件转换为 .JKS 格式文件。步骤如下:

    将证书转换为 PKCS12 格式 openssl pkcs12 -export -in &lt;domain-name.crt&gt; -inkey &lt;/path-to private.key&gt; -name &lt;alias-name&gt; -out &lt;domain-name.p12&gt;。这将生成一个 .p12 文件 在 JKS 密钥库中导入 PKCS12 文件 keytool -importkeystore -deststorepass &lt;pass-phrase&gt; -destkeystore keystore.jks -srckeystore &lt;your .p12 file&gt; -srcstoretype PKCS12。将创建一个扩展名为 .jks 的文件。 将 CA 捆绑证书导入 JKS 密钥库 keytool -import -alias &lt;alias-name&gt; -trustcacerts -file &lt;bundle.crt&gt; -keystore keystore.jks

注意:

Private.key 是您为 CA 生成的用于颁发证书的密钥。pass-phrase 是用于保护您的私钥的密码.您提供的将创建 private.key。 For more info

最后将.jks 文件复制到您的项目/resource 文件夹并更新application.properies 文件。

server.ssl.key-store=classpath:keystore.jks
server.ssl.key-store-password=<pass-phrase>
server.ssl.key-alias=<alias-name>

它应该可以工作。

【讨论】:

嗨,我对这个问题感到沮丧,并且每个人都建议创建自己的 SSL。但是,您的解决方案有效。无论如何,我可以直接使用 [1] 步骤中的 .p12 文件,而不是使用 JKS 文件。所以,它不需要私钥。谢谢。

以上是关于将 .crt 添加到 Spring Boot 以启用 SSL的主要内容,如果未能解决你的问题,请参考以下文章