将 .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的主要内容,如果未能解决你的问题,请参考以下文章

如何在spring boot中使用客户端私钥和服务器提供的证书调用服务器?

使用 Java 构建路径将 Spring 项目添加到 Spring Boot

如何将 Thymeleaf SpringSecurityDialect 添加到 Spring Boot

将密钥添加到 Spring Boot 保险库

如何将布局方言添加到spring-boot thymeleaf自动配置文件

将 Spring Boot Profile 添加到 Sleuth/Zipkin 日志