Spring Boot的HTTPS证书部署指南

译文
开发 开发工具
在本文中,我们将学习使用 Let’s Encrypt 工具为 Spring Boot 制作并自动更新 HTTPS 证书。

作者丨Emad Heydari Beni

编译丨仇凯

审校丨孙淑娟、梁策

在这篇文章中,我们将学习以下内容:

1.免费制作一个有效可用的证书

2.在 Spring Boot 应用中配置此证书

3.自动更新证书有效期

在之前的文章中,我们已经熟悉了如何通过自签名证书配置 Spring Boot 应用。自签名证书对于开发和测试来说是很好的方法。但是,如果想要将应用发布至生产环境,那么证书就需要由已知合法的证书颁发机构(Certificate Authorities,CA)签署。这些证书通常价格不菲,如果想使用 TLS 保护应用,就需要购买此类证书。服务器价格和配置的复杂性成为许多 Web 应用程序使用 HTTPS 的阻碍。

在后斯诺登时代,通过 HTTPS 进行安全访问已经是大众的共识。为了提高开发人员和 IT 管理员的安全意识,并促使其全面使用 HTTPS 技术,我们付出了很多的努力。但是,应该如何去实现呢?

Let’s Encrypt 项目致力于将 HTTPS 技术通过免费且简便的方式引入万维网(World Wide Web)。

在此文中,我们将包含以下内容:

  • 签发证书并在 Spring Boot 中部署

1.使用 Let’s Encrypt 生成证书

2.通过 PEM 证书制作 PCKS#12 证书

3.在 Spring Boot 应用中部署证书

  • 更新过期或者即将过期的证书

1.证书更新流程

2.Spring Boot 的准备工作

如何使用 Let’s Encrypt 生成证书

Let's Encrypt 为一些中间件(例如 Apache 和 Nginx)提供了几个插件。在本节中,工作环境是(带有嵌入式 Jetty 或 Tomcat 的)Spring Boot 应用程序, 我们只需要生成证书并部署在应用程序中。

如果你的服务器(或云服务商)有使用防火墙或其他安全机制,则需要开放 80 和 443 端口。

80 端口需要开放并自由使用,因为 Let’s Encrypt 需要通过自动化证书管理环境(即 ACME 协议)在后台运行一个小型 HTTP 服务来证明你拥有此域名地址的控制权。

  • 你需要花费几分钟时间在域名地址指向的服务器上获取 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)。‘standalone’代表 Let’s Encrypt 将使用 80 端口自动创建一个小型 Web 服务,以证明你拥有此域名地址的控制权。

如何通过 PEM 证书制作 PKCS12 证书

通过两个步骤就能生成证书和私钥,这足以证明 Let’s Encrypt 简单易用。Let’s Encrypt 生成的证书是 PEM 格式,而 Spring Boot 并不支持 PEM 格式的证书。Spring Boot 支持 PKCS12 格式,因此我们需要使用 OpenSSL 工具,将 PEM 格式的证书和私钥转换为 PKCS12 格式。

以下操作可以将 PEM 证书转换为 PKCS12 证书:

1.将目录路径切换至 /etc/letsencrypt/live/seeld.eu。

2.在终端中执行以下命令以通过 OpenSSL 工具将证书和私钥转换为 PKCS12 格式。

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

文件名为‘keystore.p12’的 PKCS12 格式证书现在就被保存在‘/etc/letsencrypt/live/seeld.eu’目录。

在 Spring Boot 应用中部署证书

我们将要在 Spring Boot 应用中配置证书和私钥,并为全面部署 HTTPS 做好准备,以提升 Spring Boot 应用的安全性。此时,我们已经生成了证书和私钥,并将其转换为 PKCS12 格式,以便部署在 Spring 应用中。

1.打开‘application.properties’文件

2.将下面的配置内容添加至‘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 和 443 上生效。现在,你可以通过 https://seeld.eu 来访问。

证书更新

Let’s Encrypt 的证书有效期只有 90 天。有人可能会说,相较于其他证书提供商签发的证书有效期,3 个月太短了。Let’s Encrypt 这个决定有两个目的:降低密钥泄露或错误发布造成的损害,以及鼓励自动化。现在,让我们开始配置证书自动更新。

  • 打开 Let's Encrypt 客户端(certbot)所在目录

备注:证书和密钥存放在同一台服务器上。(请阅读所有章节的备注,例如安装 Python,开放 80 端口等)

  • 执行下面的命令以开启自动更新功能
$ sudo ./certbot-auto renew

该命令将检查此服务器上(由 Let’s Encrypt 管理)证书的过期时间并在过期或即将过期时自动更新证书。

轻松获取新的证书

正如前文所述:Spring Boot 并不支持(由 Let’s Encrypt 生成的)PEM 格式的证书。因此,我们需要通过 OpenSSL 将证书转换为 Spring Boot 支持的 PKCS12 格式的证书。

Spring Boot 准备工作

让我们创建 PKCS#12 密钥。

1.将目录路径切换至 /etc/letsencrypt/live/seeld.eu。

2.在终端中执行以下命令以通过 OpenSSL 工具将证书和私钥转换为 PKCS12 格式。

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

文件名为‘keystore.p12’的 PKCS12 格式证书现在就被保存在‘/etc/letsencrypt/live/seeld.eu’目录。

等等!

假设服务器运行的是 Spring Boot 应用,这意味着工作还没有全部完成。过期或即将过期的‘keystore.p12’证书依然驻留在内存中,因此我们需要重启 Spring Boot 应用才能使上述证书更新工作生效。

简单重启 Spring Boot 应用并不是万无一失的。或许还有其他方法可以在不重启 Spring Boot 应用的情况下对证书进行更新,但这并不在本文的讨论范围内。

总结

在本文中,我们学习了如何签发、更新 Let’s Encrypt 证书,特别是将其部署在 Spring Boot 应用中。如果你确实没有其他配置可以调整,那么不用 5 分钟就可以完成上述所有操作。

由此看来,Let’s Encrypt 的证书签发和续订快速、简单、成本低廉。无论需要管理多少 Web 服务,尽快使用 HTTPS 不失为上佳之选。

译者介绍

仇凯,51CTO 社区编辑,目前就职于北京宅急送快运股份有限公司,职位为信息安全工程师。主要负责公司信息安全规划和建设(等保,ISO27001),日常主要工作内容为安全方案制定和落地、内部安全审计和风险评估以及管理。

责任编辑:武晓燕 来源: 51CTO技术栈
相关推荐

2022-06-28 15:04:32

容器Docker

2022-06-28 15:06:35

容器Spring

2022-07-21 11:04:53

Swagger3Spring

2021-01-06 10:09:05

Spring Boothttps sslhttps

2022-07-27 10:39:14

Spring代码IDEA

2020-03-24 14:55:48

Spring Boot多模块Java

2020-07-02 15:40:11

Spring BootJar包Java

2020-09-24 07:51:45

HTTPS证书接口

2019-07-23 15:56:56

Spring Boot部署servlet

2022-11-26 00:00:03

Spring指南体系

2019-07-23 17:52:59

Spring BootJava开发

2019-02-14 14:33:22

Spring BootTomcat开发

2015-12-31 10:35:53

HTTPS 证书HTTPS网络协议

2018-12-18 10:07:41

Spring Boot服务器HTTP2

2021-12-11 13:29:36

SpringBoot 官方

2023-10-06 23:40:49

Spring开发

2022-04-28 08:05:05

数据库数据库交互

2020-09-21 06:54:59

热部署Spring日志

2020-03-22 21:15:35

HTTPS证书SSL信息安全

2017-07-25 10:57:05

点赞
收藏

51CTO技术栈公众号