也许我会在这里找到帮助。我想在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
certificate.crt,certificate.p12,certificate.pk,privkey.pem和 三个文件root_ca_1.ca-bundle,root_ca_2.ca-bundle, root_ca_3.ca束
。这就是我的全部。我对ssl主题非常新鲜,只是阅读了一些教程并尝试了一些keytool命令来使其工作。我很感激你的帮助。提前谢谢。
答案 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 密钥库。要求是:
我将使用我的 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 -importkeystore -srckeystore jimtough-dot-org.p12 -srcstoretype PKCS12 -destkeystore jimtough-dot-org-keystore.jks -deststoretype JKS
keytool -importkeystore -srckeystore jimtough-dot-org-keystore.jks -destkeystore jimtough-dot-org-keystore.pkcs12 -deststoretype 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 等云系统中已经有一些熟悉的东西),并且可以扩展您的应用程序。