快速上手:采用Let‘sEncrypt免费SSL证书配置网站Https (示例环境:Centos7.9+Nginx+Let‘sEncrypt)
1 关于Let’s Encrypt与Cerbot DNS验证
Let’s Encrypt 是一个提供 免费证书 的 认证机构。
Cerbot 是 Let’s Encrypt 提供的一个工具,用于自动化生成、验证和续订证书。
DNS验证是 Cerbot 支持的验证方式之一。相比 HTTP 验证或 TLS-ALPN 验证,DNS 验证更灵活,可以用于获取任意域名(如子域名或裸域名)的证书,无需直接访问服务器。 DNS 验证通过在目标域名的 DNS 记录中添加特定的文本记录(TXT 记录)来证明 对该域名的控制权。认证机构会查询域名的 DNS TXT 记录以验证域名所有权。
以下是 DNS 验证的具体步骤和背后逻辑:
(1) 生成挑战内容
- Cerbot 向 Let’s Encrypt 发送证书申请,提供需要认证的域名。
- Let’s Encrypt 返回一个挑战(Challenge),内容包括一个随机字符串(Challenge Token)。
(2) 计算验证字符串
- Cerbot 结合 Challenge Token 和账户密钥生成一个验证字符串。
- 验证字符串 =
SHA256(account_key + token)
或类似算法的结果。
- 验证字符串 =
- 这个字符串需要通过 DNS TXT 记录发布。
(3) 添加 DNS TXT 记录
- Cerbot 会提示用户手动或通过 API 在域名的 DNS 配置中添加一条 TXT 记录:
- 记录名:
_acme-challenge.<your-domain>
- 记录值: 验证字符串
- 记录名:
例如,对于域名 example.com
:
_acme-challenge.example.com. IN TXT "验证字符串"
(4) 验证记录
- Let’s Encrypt 会查询域名的 DNS 服务器,寻找
_acme-challenge.<your-domain>
的 TXT 记录。 - 如果记录值与预期验证字符串匹配,则证明申请者对该域名具有控制权。
(5) 签发证书
- 验证成功后,Let’s Encrypt 会签发证书,Cerbot 会下载并保存证书。
Let’s Encrypt官网
参考教程
2 网站HTTPS配置最佳实践
-
使用Cerbot生成Let’s Encrypt证书、DNS厂家添加TXT记录、继续完成Cerbot的控制权认证
-
Nginx对网站进行Https配置(HTTP的重定向到HTTPS)
-
业务服务的HTTPS配置,这里有两种方式(按需):
- 🤷♂️服务本身支持HTTPS(一般开发后业务服务为http协议接口),如SpringBoot Web项目,可使用java keytool生成密钥配置ssl。若业务服务本身不支持https,不建议调整业务模块,保证业务开发的纯净。
- 👍通过Nginx对接口进行转发,http重定向为https,这种方式是推荐的。
3 具体操作
3.1 服务器安装cerbot工具
cerbot用来管理Let’s Encrypt的证书(申请、续约)。我的服务器操作系统为centos7.9,执行的有效操作如下:
# 安装cerbot工具,cerbot用来管理Let's Encrypt的证书(申请、续约)
sudo yum install certbot
查看certbot版本验证工具安装是否成功:
[root@vm ~]# certbot --version
# 正确输出cerbot工具版本
certbot 1.11.0
3.2 cerbot使用 DNS 验证获取单域名证书
3.2.1 cerbot验证与证书生成(交互式)
- 键入下列命令,为指定域名生成证书(交互式方式进行,用户多次键入信息来完成验证信息的采集与证书的颁发)
sudo certbot certonly --manual --preferred-challenges dns -d demo.cn -d www.demo.cn
- 用户填入信息(邮箱)等用来订阅域名信息服务(如Let’s Encrypt的证书升级、到期通知等)
- 验证服务器与域名归属相关操作
(1)cerbot工具输出dns解析txt值
(2)dns解析后台添加txt的解析记录(两条)
- cerbot工具进行验证,验证通过,输出证书到服务器
3.2.2 Nginx配置
- 修改nginx配置(主要是配置站点重定向、启用ssl、配置证书路径)
nginx配置非常灵活且具有扩展性,其配置目录大致如下:
- /etc/nginx/
| - nginx.conf 主配置文件(定义了全局配置、事件模块、HTTP 模块等核心设置)
| - ./conf.d/ 配置目录(此目录一般被主配置文件中被include)
| - www.demo.cn.conf (自己的站点配置,针对www.demo.cn的https配置就在这里)
| - ...
# 使用的Nginx版本
[root@vm ~]# nginx -v
nginx version: nginx/1.20.1
www.demo.cn.conf
配置文件内容:
server {
listen 80;
server_name demo.cn www.demo.cn;
# Redirect all HTTP requests to HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name demo.cn www.demo.cn;
root /usr/share/nginx/html;
index index.html index.htm;
# SSL Configuration
ssl_certificate /etc/letsencrypt/live/demo.cn/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/demo.cn/privkey.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# Additional security headers (optional)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# Error pages
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
# Default location
location / {
try_files $uri $uri/ =404;
}
}
- 重启nginx刷新配置
# 重启nginx
sudo systemctl restart nginx
# 查看nginx状态
sudo systemctl status nginx
- 清空缓存,查看网站
没错,到此为止网站已经完成了https的配置,有几点说明:
nginx.conf
配置未作修改!但需要检查nginx.conf
配置中是否include了conf.d
配置目录。- 如果之前网站接入的服务为
http
,需要对服务进行调整使协议兼容,可以通过使用nginx反向代理服务为https
(推荐),或者改造服务自身支持https。
- 通过nginx反向代理API服务为https的配置大致如下
server {
listen 443 ssl http2;
server_name demo.cn www.demo.cn;
...
location /your-api/module1 {
allow 127.0.0.1; # 本地回环地址
allow otherip; # 允许指定的 IP 地址
allow ::1; # IPv6 本地地址
deny all; # 禁止其他所有来源
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /your-api/module2 {
allow 127.0.0.1; # 本地回环地址
allow otherip; # 允许指定的 IP 地址
allow ::1; # IPv6 本地地址
deny all; # 禁止其他所有来源
proxy_pass http://127.0.0.1:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
...
}
3.2.3 cerbot证书续费
certbot certonly --renew-by-default -d demo.cn -d www.demo.cn
# 会输出1、2两种验证方式,我采用的是模式2
续费命令说明:
certbot
- Certbot 是一个用于申请和管理 Let’s Encrypt SSL 证书的工具。
certonly**
- 表示只申请证书,不自动安装或配置 Web 服务器(如 Nginx 或 Apache)。
- 适合手动配置证书的场景。
--renew-by-default
- 如果证书已经存在,Certbot 会尝试续费(renew)而不是重新申请。
- 如果证书不存在,Certbot 会申请新证书。
-d demo.cn -d www.demo.cn
-d
参数用于指定域名。- 这里申请的是
demo.cn
和www.demo.cn
两个域名的证书。 - 多个
-d
参数表示申请一个包含多个域名的证书(SAN 证书)。
两种验证域名所有权:
Spin up a temporary webserver (standalone)
- Certbot 会启动一个临时的 Web 服务器来完成 HTTP-01 验证。
- 适用场景:如果你没有运行 Web 服务器(如 Nginx 或 Apache),或者可以暂时停止 Web 服务器。
- 注意事项:需要确保 80 端口未被占用,或者暂时停止 Web 服务器。
Place files in webroot directory (webroot)
- Certbot 会将验证文件放置在你的 Web 服务器的根目录(如 /var/www/html),通过 HTTP 访问验证文件。
- 适用场景:如果你正在运行 Web 服务器(如 Nginx 或 Apache),并且不想停止服务。
- 注意事项:需要指定 Web 根目录路径。