Spring启动 - 使用CA证书启用SSL

时间:2017-07-13 09:36:00

标签: java ssl spring-boot https jks

也许我会在这里找到帮助。我想在Spring Boot应用程序上启用SSL。我的配置如下:

  

server:port:8999 ssl:       启用:true       key-store:classpath:keystore.jks       密钥存储密码:mypass       密钥密码:mypass

问题是我的密钥库。我已将* crt文件导入到别名为'tomcat'的密钥库中:

keytool -importcert -file certificate.crt -keystore native.jks -alias tomcat

然而,我仍然无法正常访问我的休息api。它在firefox中呕吐错误:

  

SSL_ERROR_RX_RECORD_TOO_LONG

  • 它不起作用。如何使适当的密钥库使其工作?我正在签发CA证书,而不是自签名。我有类似的文件:
  

certificate.crt,certificate.p12,certificate.pk,privkey.pem和   三个文件root_ca_1.ca-bundle,root_ca_2.ca-bundle,   root_ca_3.ca束

。这就是我的全部。我对ssl主题非常新鲜,只是阅读了一些教程并尝试了一些keytool命令来使其工作。我很感激你的帮助。提前谢谢。

3 个答案:

答案 0 :(得分:3)

我刚刚花了一个下午弄清楚这个确切的问题,所以我会在这里分享我的过程。

以下每个参考资料都提供了有关如何生成和使用自签名证书的说明。这并不完全是我想要做的,但这些都包含一些有用的背景信息。

参考:

我已经为 *.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 给我发回了一个包含 .p7b、.crt 和 .ca-bundle 文件的 .zip 文件。

以下参考链接之一解释了这些证书文件类型之间的区别:

  • .p7b - 此类型应与基于 Java 的应用程序兼容(PKCS#7 格式)
  • .crt - 这种类型应该与大多数其他东西兼容 - 上面的链接表明这是 PEM 格式
  • .ca-bundle - 不确定何时使用 - 上面的链接表明这是 PEM 格式

参考:

接下来我需要弄清楚如何使用我上面列出的文件来为 HTTPS 配置我的 Spring Boot 应用程序。

我将按照以下教程的相关部分来获取我需要的内容:

注意:在这两个教程中,我不会遵循他们关于创建自签名证书的部分,因为我已经拥有由真实 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 使用愉快!

答案 1 :(得分:0)

好吧,您需要在ssl配置中添加更多属性

server:
ssl:
  key-store: classpath:config/tls/keystore.p12
  key-store-password: password ##this will be your certificate password
  key-store-type: PKCS12
  ciphers: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  enabled-protocols: TLSv1.2
http2:
  enabled: true

确保p12密钥库文件位于config / tls中的类路径(src / main / resources)下

但是要生成密钥库文件,请使用以下openssl命令,其中 将使用.crt和.key文件生成.p12文件。

.crt和.key位于文件夹CA下,文件p12将是 在CA下生成

请注意,您将在之后要求输入证书密码 运行以下命令

openssl pkcs12 -export -in CA/certificate.crt -inkey CA/certificate.key -name certificate -out CA/certificate.p12

如果要将此证书添加到本地cacert,请使用 下面的命令

在jre \ lib \ security下

keytool -importcert -noprompt -trustcacerts  -alias ca.certificate  -file   CA/certificate.crt -keystore   cacerts -storepass changeit

答案 2 :(得分:-1)

不要将 spring-boot 用于 SSL 连接。让反向代理处理 SSL 终止。
因此,有可能某个工具可以自动更新您的证书(例如 certbot)。
而且您不需要将(秘密的)私钥放入您的应用程序中。

分享您的应用程序更简单。服务器管理员只需要设置反向代理(或者在 kubernetes 等云系统中已经有一些熟悉的东西),并且可以扩展您的应用程序。

好处

  • 可扩展的应用程序
  • 更简单的弹簧设置
  • 您的应用程序中没有秘密
  • 更简单地使用应用程序 (#cloudSystems)
  • 大多数反向代理都与 certbot 兼容