如何设置Let's Encrypt SSL证书并在Spring Boot应用程序中使用?

59
我刚开始接触服务器保护,对此并不了解,但我需要让我的运行在Digital Ocean Droplet上的Spring Boot应用程序使用HTTPS。
我的想法是申请一个letsencrypt证书并告诉Spring使用该证书。
然而,我不知道如何操作。
谢谢。
8个回答

141

我写了两篇关于 Let's Encrypt 和 Spring Boot 的博客文章。

  1. 颁发证书。 使用 Let’s Encrypt 证书保护 Spring Boot 应用
  2. 更新证书Spring Boot 的 Let's Encrypt 证书更新

简单来说,步骤如下:

  1. 拉取Let's Encrypt 客户端 (certbot)。

  2. 为您的域名(例如example.com)生成证书。

    ./certbot-auto certonly -a standalone -d example.com -d www.example.com

文件将生成在 /etc/letsencrypt/live/example.com 中。Spring Boot 需要 PKCS#12 格式的文件,这意味着您必须将密钥转换为 PKCS#12 密钥库(例如使用 OpenSSL)。如下所示:

  1. 打开/etc/letsencrypt/live/example.com 目录。
  2. 运行以下命令:

    openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out keystore.p12 -name tomcat -CAfile chain.pem -caname root

`openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out keystore.p12 -name tomcat -CAfile chain.pem -caname root`

现在在/etc/letsencrypt/live/example.com目录下生成了PKCS12格式的keystore.p12文件。

现在是时候配置你的Spring Boot应用程序了。打开application.properties文件并将以下属性放入其中:

server.port=8443
security.require-ssl=true
server.ssl.key-store=/etc/letsencrypt/live/example.com/keystore.p12
server.ssl.key-store-password=<your-password>
server.ssl.keyStoreType=PKCS12
server.ssl.keyAlias=tomcat

阅读我的博客文章以获取更多细节和评论。


1
太棒了。我认为这就是我最终搞定的方法,但我不得不从2或3个不同的来源中获取信息,并且摸索着完成它。当我需要更新时,这将使事情变得更加容易。 - BrandenS
2
我在生产环境中需要使用server.port: 8443吗?还是server.port: 80就可以了? - Vitor Vezani
6
每次让 Let's Encrypt 更新证书时,我都需要手动重新创建 p12 文件吗? - JavierSegoviaCordoba
2
请注意,即使未提供密码密钥,它也会抛出错误,您应该添加密钥库密码,即使密码为空。 - shareef
1
很遗憾,certbot-auto已经不存在了。我已经在Ubuntu 22.04 LTS上测试了您的页面,但无法获得证书。 - Federico Galimberti
显示剩余11条评论

9

步骤1:从Git下载Certbot

您需要在指向您的域名地址的服务器上获取Let's Encrypt的源代码。此步骤可能需要几分钟。

$ git clone https://github.com/certbot/certbot

$ cd certbot

$ ./certbot-auto --help

注:必须预先安装Python 2.7.8(或更高版本)。

步骤2:生成证书和私钥

通过在终端中执行以下命令,Let's Encrypt为您生成证书和私钥。

$ ./certbot-auto certonly -a standalone \

-d example.com -d example.com

注意:密钥生成在/etc/letsencrypt/live/example.com目录中。

步骤3:从PEM文件生成PKCS12文件

要将PEM文件转换为PKCS12版本: 进入/etc/letsencrypt/live/example.com 在终端中使用OpenSSL将密钥转换为PKCS12,如下所示。

$ openssl pkcs12 -export -in fullchain.pem \

       -inkey privkey.pem \

           -out keystore.p12 \

       -name tomcat \

       -CAfile chain.pem \

       -caname root

输入导出密码:

验证 - 输入导出密码:

(注意:逐行书写并按回车键)

步骤4:Spring Boot应用程序的配置

打开您的'application.properties'文件

将此配置放置在其中。

server.port=8443 security.require-ssl=true

server.ssl.key-store=/etc/letsencrypt/live/example.com/keystore.p12

server.ssl.key-store-password= password

server.ssl.keyStoreType= PKCS12

server.ssl.keyAlias= tomcat


1
很好地解释了。 - devnull
找不到文件或目录:-bash: ./certbot-auto。我遇到了这个异常。 - Kumaresan Perumal
@Kumaresan,我猜他们已经更新了git,我会添加新的步骤来拉取这个,谢谢你。 - Pranay Kumbhalkar
@Kumaresan,我猜他们已经更新了git,我会添加新的步骤来拉取这个,谢谢。 - undefined
好的,没问题。我会帮你搞定的。谢谢。 - Kumaresan Perumal

7

这是很好的建议,但现在已经过时了(它不支持Let'sEncrypts ACME API v2)。请查看https://letsencrypt.org/docs/client-options/以获取其他最新版客户端! - Vanheden

2

对于Spring Boot WebFlux,属性的配置已发生更改。

server.port=443

server.ssl.enabled=true//the changed line
server.ssl.keyAlias=netty
server.ssl.key-store=path
server.ssl.key-store-password=password
server.ssl.keyStoreType=PKCS12

server.ssl.enabled 的默认值为 true,因此技术上不需要这个。 - Chris

1
我创建了一个纯Java的小型库,允许在Spring-Boot中嵌入Tomcat并自动获取和保持Lets Encrypt证书的新鲜度:Spring-Boot LetsEncrypt helper
它只是一个Java文件 + ACME4J/BouncyCastle的依赖项,因此可以将其作为代码重用。
简而言之,它执行以下操作:
应用程序启动时,如果尚不存在,它将根据您的server.ssl属性创建KeyStore(并在其中添加过期的自签名证书)。
为了从LetsEncrypt接收HTTP-01 ACME挑战,它会在端口80上注册Tomcat连接器。
启动一个线程,检查KeyStore中的证书是否已过期或丢失。
如果证书已过期/丢失,它会向LetsEncrypt发出订单,并通过端口80传递HTTP-01 ACME挑战。
通过挑战后,它会将证书存储到server.ssl定义的KeyStore中,并在启用Tomcat HTTPS的连接器上发出reloadSslHostConfigs
通过这些步骤,整个LetsEncrypt证书的生命周期从发行到更新都在Java应用程序中完成,而无需使用任何非Java第三方组件。

1

letsencrypt-tomcat 可以在运行时通过 Let's encrypt 查询和刷新证书(无需重新启动)。
它适用于独立和嵌入式 Tomcat 以及 Spring Boot。

它被打包成 Docker 镜像,方便重复使用。镜像包含:

  • dehydrated 用于通过 Let's Encrypt 管理证书,
  • tomcat-reloading-connector 用于在续订后运行时热重载证书,
  • 一个初始化系统(dumb-init)用于正确处理 Tomcat 和 Dehydrated 进程,
  • 一个入口脚本,启动 Tomcat 和 Dehydrated,
  • Apache Portable Runtime(APR)的预编译版本和 Tomcat 使用的 APR JNI 封装器(libtcnative),使 Tomcat 提供最佳的 TLS 性能。

阅读这篇博客文章,了解如何在您的应用程序中使用它以及更多技术细节。


0

在将 .pem 导出为 .p12 时,我遇到了一些问题,keytool 无法识别文件格式。在经过多次搜索后,我找到了下面这个命令:

openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out keystore.p12 -name tomcat -CAfile chain.pem -caname root -legacy -passout pass:changeit

之后,您将拥有文件keystore.p12,因此请像Emad Van Ben之前所说的那样在application.properties中设置配置。


-1
  1. 从letsencrypt获取SSL证书
  2. 使用Java中的keytool命令将其添加到密钥库中
  3. 配置您的Spring应用程序以使用上面生成的密钥库

文件应如下所示:

 server.port = 8443
 server.ssl.key-store = classpath:sample.jks
 server.ssl.key-store-password = secret
 server.ssl.key-password = password

谢谢! 看起来我有点正确的方向。有人可以详细说明如何使用keytool添加证书吗? - BrandenS
请查看keytool帮助页面http://docs.oracle.com/javase/8/docs/technotes/tools/windows/keytool.html - AlBlue
也许这些教程可以帮到您。 - JrBenito

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接