如何设置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
属性中的定义创建 KeyStore(并在那里添加自签名过期证书)。
在端口 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 证书?