如何设置letsencrypt SSL证书并在Spring Boot应用程序中使用它?

Posted

技术标签:

【中文标题】如何设置letsencrypt SSL证书并在Spring Boot应用程序中使用它?【英文标题】:How can I set up a letsencrypt SSL certificate and use it in a Spring Boot application? 【发布时间】:2016-08-27 18:09:34 【问题描述】:

我是保护服务器的新手,所以我对此不太了解,但我需要让我的 Spring Boot 应用程序在 Digital Ocean Droplet 上运行才能使用 HTTPS。

我的想法是注册一个letsencrypt证书,然后告诉Spring使用它。

但是,我不知道该怎么做。

谢谢。

【问题讨论】:

【参考方案1】:

我在纯 Java 中创建了一个小型库,它允许 Spring-Boot 中的嵌入式 Tomcat 自动获取并保持 Lets Encrypt 证书新鲜:Spring-Boot LetsEncrypt helper

它只是 one Java file + 对 ACME4J/BouncyCastle 的依赖,因此可以将其作为代码重用

简而言之,它执行以下操作:

    在应用程序启动时,如果 KeyStore 尚不存在,它会按照您的 server.ssl 属性中的定义创建 K​​eyStore(并在那里添加自签名过期证书)。 在端口 80 上为来自 LetsEncrypt 的 HTTP-01 ACME 质询注册 Tomcat 连接器 启动线程检查 KeyStore 中的证书是否已过期或丢失 如果证书过期/丢失,它会向 LetsEncrypt 发出命令并在端口 80 上通过 HTTP-01 ACME 质询。 通过质询后,它将证书存储到定义在 server.ssl 中的 KeyStore 中,并在启用 Tomcat HTTPS 的连接器上发出 reloadSslHostConfigs

通过这些步骤,从颁发到更新的整个 LetsEncrypt 证书生命周期都包含在 Java 应用程序本身中,而没有任何非 Java 第三方

【讨论】:

【参考方案2】:

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

    颁发证书。 Spring Boot Application Secured by Let’s Encrypt Certificate 更新证书。 Let’s Encrypt Certificate Renewal: for Spring Boot

简而言之,步骤如下:

    拉取Let's Encrypt client (certbot)。

    为您的域(例如 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)。如下:

    打开 /etc/letsencrypt/live/example.com 目录。
    `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

阅读我的blog post 了解更多详情和评论。

【讨论】:

太棒了。我认为这几乎就是我最终实现它的方式,但我不得不从 2 或 3 个不同的来源中获取信息,然后一路颠簸。当我必须续订时,这将变得更加容易。 我必须在生产中使用 server.port: 8443 吗?还是 server.port: 80 就可以了? 在哪里可以找到/定义密钥存储密码? @EmadVanBen 那么每次让我们加密更新证书时,我都必须手动重新创建 p12? 仅供参考,即使您没有提供密码密钥,它也会引发错误,您应该添加 key-store-password 即使 fi pass 为空【参考方案3】:

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

它被打包到一个 Docker 映像中,以便于重用。图片包含:

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

阅读此blog post,了解如何在您的应用程序中使用它以及有关技术细节的更多信息。

【讨论】:

【参考方案4】:

对于 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,因此技术上不需要。【参考方案5】:

另一种选择是使用 Spring Boot Starter ACME:

https://github.com/creactiviti/spring-boot-starter-acme

ACME(自动证书管理环境)它是 LetsEncrypt 用于自动颁发证书的协议。

【讨论】:

【参考方案6】:

第 1 步:从 git 下载 certbot

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

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

$ cd certbot

$ ./certbot-auto --help

备注:需提前安装Python 2.7.8(或以上)。

第二步:生成证书和私钥

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

$ ./certbot-auto certonly -a 独立的 \

-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

输入导出密码:

验证 - 输入导出密码:

(注意:一次写一行,然后按回车)

Step4:配置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= 密码

server.ssl.keyStoreType=PKCS12

server.ssl.keyAlias=tomcat

【讨论】:

很好解释 =)【参考方案7】:
    从letsencrypt获取SSL证书 使用 Java 中的 keytool 命令将其添加到密钥库中 配置您的 Spring 应用程序以使用上面生成的密钥库

文件应如下所示:

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

【讨论】:

谢谢!所以我有点像在正确的轨道上。谁能详细说明我如何使用 keytool 添加该证书? 查看 keytool 帮助页面docs.oracle.com/javase/8/docs/technotes/tools/windows/… 也许this tutorials 可以提供帮助。

以上是关于如何设置letsencrypt SSL证书并在Spring Boot应用程序中使用它?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Heroku Node Express 应用程序中使用 LetsEncrypt SSL 证书?

用 letsencrypt 生成 SSL 证书

我该如何解决伪造laravel上的“我们无法在您的服务器上获取LetsEncrypt SSL证书?”

Letsencrypt SSL 证书过期问题

letsencrypt的免费SSL证书续签及解决办法

Letsencrypt SSL证书上的WebSocket连接失败