在本文中,我们将学习如何执行以下操作:
- 免费生成有效证书
- 用它配置一个 Spring Boot 应用程序
- 到期时续订
在我之前的博客文章中,我们熟悉了带有自签名证书的 Spring Boot 应用程序的配置。自签名证书适用于特定目的,例如测试和开发。但是,如果需要将他的应用程序发送到生产环境,证书应该由已知且合法的证书颁发机构 (CA) 签署。
这些类型的证书通常很昂贵。如果您想使用 TLS 强化您的应用程序,您需要购买其中之一。应用程序服务器的价格和复杂的配置成为许多 Web 应用程序使用安全连接的障碍。
在后斯诺登时代,没有人需要说服我们使用 HTTPS 进行安全连接是必须的。为了提高开发人员和 IT 管理员对他们制作的每个网站使用此类技术的意识,我们付出了很多努力。但是怎么做?
Let's Encrypt项目旨在将 HTTPS 引入万维网,不仅免费,而且采用最简单的配置方式。
在本文中,我们将介绍:
- 颁发证书和 Spring Boot 集成
- 如何使用 Let's Encrypt 生成证书
- 如何从 PEM 文件生成 PCKS#12 文件
- Spring Boot 应用程序的配置
- 续订(即将)过期的证书
- 续订流程
- 准备 Spring Boot
1
如何使用 Let's Encrypt 生成证书
Let's Encrypt 为一些应用服务器(如 Apache 和 Nginx)提供了几个插件。在本节中,由于我们的目标是 Spring Boot 应用程序(带有嵌入式 Jetty/Tomcat),我们只生成证书,然后与我们的应用程序集成。
如果您在服务器或云提供商处使用防火墙或任何其他安全机制,您应该放松几分钟,尤其是端口 80 和端口 443。
80 端口应该是开放的并且可以免费使用,因为 Let's Encrypt 在后台运行一个小型 HTTP 服务器来证明您是否控制您的域地址(ACME 协议)。
- 您需要在您的域地址指向的服务器上获取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 standalone
-d seeld.eu -d www.seeld.eu
密钥在/etc/letsencrypt/live/seeld.eu中生成。
备注: 'certonly' 表示该命令不附带任何特殊插件,如 Apache 或 Nginx。“独立”意味着 Let's encrypt 将自动在端口 80 上创建一个简单的 Web 服务器,以证明您控制了域。
2
如何从 PEM 文件生成 PKCS12 文件
证书和私钥分两步免费生成,可见Let's Encrypt的简单性。所有这些生成的材料都带有PEM扩展,Spring Boot 不支持该扩展。Spring Boot 不支持 Let's Encrypt 生成的 PEM 文件。Spring Boot 支持 PKCS12扩展。使用 OpenSSL,我们将证书和私钥转换为 PKCS12。
要将 PEM 文件转换为 PKCS12 版本:
- 转到 /etc/letsencrypt/live/seeld.eu。
- 我们在终端中使用 OpenSSL 将密钥转换为 PKCS12,如下所示。
$ openssl pkcs12 -export -in fullchain.pem
-inkey privkey.pem
-out keystore.p12
-name tomcat
-CAfile chain.pem
-caname root
现在在“/etc/letsencrypt/live/seeld.eu”中生成带有 PKCS12 的文件“keystore.p12”。
3
Spring Boot 应用程序的配置
现在我们想要配置我们的 Spring Boot 应用程序以从证书和私钥中受益,并最终准备好 HTTPS。此时,我们已经生成了我们的证书和私钥。然后我们将密钥转换为 PKCS12 扩展,该扩展已准备好用于 Spring 应用程序。
- 打开你的'application.properties'
- 把这个配置放在那里
server.port: 8443
security.require-ssl=true
server.ssl.key-store:/etc/letsencrypt/live/seeld.eu/keystore.p12
server.ssl.key-store-password: <your-password>
server.ssl.keyStoreType: PKCS12
server.ssl.keyAlias: tomcat
备注'require - ssl' - 表示您的服务器仅处理受 HTTPS 保护的请求。
如果您访问 https://seeld.eu:8443,您可以看到 HTTPS 已成功配置并且最重要的是可以正常工作。为了我们的项目,我们做了一些额外的步骤来让 HTTPS 使用端口 80。您可以使用 https://seeld.eu URL 浏览它。
4
续订过程
Let's Encrypt 证书的有效期只有90 天。有人可能会说,与其他提供商提供的证书的有效期相比,3 个月太短了。他们做出这个严格决定有两个动机:限制密钥泄露或错误发布造成的损害,以及鼓励自动化。所以让我们开始吧!
- 打开您的 Let's Encrypt 客户端目录,我的意思是 certbot。
备注:在证书和密钥所在的同一台机器上。请阅读章节中的所有备注,例如安装 python、打开端口 80 等。
- 按如下方式运行更新命令。
$ sudo ./certbot-auto renew
此命令检查位于本机(由 Let's Encrypt 管理)中的证书的到期日期,并更新已过期或即将过期的证书。
我们有新证书,就这么简单!
如本节所述:Spring Boot 不支持 Let's Encrypt 生成的 PEM 文件。Spring Boot 支持 PKCS12 扩展。使用 OpenSSL,我们将证书和私钥转换为 PKCS12。
5
准备 Spring Boot
让我们创建一个 PKCS#12 密钥库!
- 转到 /etc/letsencrypt/live/seeld.eu
- 我们在终端中使用 OpenSSL 将密钥转换为 PKCS12,如下所示。
$ openssl pkcs12 -export -in fullchain.pem
-inkey privkey.pem
-out keystore.p12
-name tomcat
-CAfile chain.pem
-caname root
现在在“/etc/letsencrypt/live/seeld.eu”中生成带有 PKCS12的文件“ keystore.p12 ”。
可是等等!
我假设您正在使用的机器是运行 Spring Boot 的机器。这意味着我们还没有完成!之前的' keystore.p12 '还在内存中,意味着你需要重启你的应用程序!
简单地重新启动正在运行的应用程序并不总是可行的。可能还有其他方法可以在不重新启动的情况下对其进行更新,但这不在本文的讨论范围内。
6
最后
在这篇文章中,我们了解了如何颁发、更新 Let's Encrypt 证书,最重要的是,将其与 Spring Boot 集成。只需不到 5 分钟即可准备好所有东西。
对我来说,主要的信息是 Let's Encrypt 让(重新)颁发证书对每个人来说都非常快速、简单和便宜,无论你管理多少服务!您应该尽快开始使用 HTTPS。