快速上手:采用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,执行的有效操作如下:

shell 复制代码
# 安装cerbot工具,cerbot用来管理Let's Encrypt的证书(申请、续约)
sudo yum install certbot

查看certbot版本验证工具安装是否成功:

shell 复制代码
[root@vm ~]# certbot --version
# 正确输出cerbot工具版本
certbot 1.11.0

3.2 cerbot使用 DNS 验证获取单域名证书

3.2.1 cerbot验证与证书生成(交互式)

  1. 键入下列命令,为指定域名生成证书(交互式方式进行,用户多次键入信息来完成验证信息的采集与证书的颁发)
shell 复制代码
sudo certbot certonly --manual --preferred-challenges dns -d demo.cn -d www.demo.cn
  1. 用户填入信息(邮箱)等用来订阅域名信息服务(如Let's Encrypt的证书升级、到期通知等)
  1. 验证服务器与域名归属相关操作
    (1)cerbot工具输出dns解析txt值
    (2)dns解析后台添加txt的解析记录(两条)
  1. cerbot工具进行验证,验证通过,输出证书到服务器

3.2.2 Nginx配置

  1. 修改nginx配置(主要是配置站点重定向、启用ssl、配置证书路径)

nginx配置非常灵活且具有扩展性,其配置目录大致如下:

shell 复制代码
- /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配置文件内容:

nginx 复制代码
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;
    }
}
  1. 重启nginx刷新配置
shell 复制代码
# 重启nginx
sudo systemctl restart nginx
# 查看nginx状态
sudo systemctl status nginx
  1. 清空缓存,查看网站

没错,到此为止网站已经完成了https的配置,有几点说明:

  • nginx.conf配置未作修改!但需要检查nginx.conf配置中是否include了conf.d配置目录。
  • 如果之前网站接入的服务为http,需要对服务进行调整使协议兼容,可以通过使用nginx反向代理服务为https(推荐),或者改造服务自身支持https。
  1. 通过nginx反向代理API服务为https的配置大致如下
nginx 复制代码
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证书续费

shell 复制代码
certbot certonly --renew-by-default -d demo.cn -d www.demo.cn
# 会输出1、2两种验证方式,我采用的是模式2

续费命令说明:

  1. certbot
    • Certbot 是一个用于申请和管理 Let's Encrypt SSL 证书的工具。
  2. certonly**
    • 表示只申请证书,不自动安装或配置 Web 服务器(如 Nginx 或 Apache)。
    • 适合手动配置证书的场景。
  3. --renew-by-default
    • 如果证书已经存在,Certbot 会尝试续费(renew)而不是重新申请。
    • 如果证书不存在,Certbot 会申请新证书。
  4. -d demo.cn -d www.demo.cn
    • -d 参数用于指定域名。
    • 这里申请的是 demo.cn 和 www.demo.cn 两个域名的证书。
    • 多个 -d 参数表示申请一个包含多个域名的证书(SAN 证书)。

两种验证域名所有权:

  1. Spin up a temporary webserver (standalone)
    • Certbot 会启动一个临时的 Web 服务器来完成 HTTP-01 验证。
    • 适用场景:如果你没有运行 Web 服务器(如 Nginx 或 Apache),或者可以暂时停止 Web 服务器。
    • 注意事项:需要确保 80 端口未被占用,或者暂时停止 Web 服务器。
  2. Place files in webroot directory (webroot)
    • Certbot 会将验证文件放置在你的 Web 服务器的根目录(如 /var/www/html),通过 HTTP 访问验证文件。
    • 适用场景:如果你正在运行 Web 服务器(如 Nginx 或 Apache),并且不想停止服务。
    • 注意事项:需要指定 Web 根目录路径。
相关推荐
程序员夏洛24 分钟前
TCP 是用来解决什么问题?
java·网络协议·http·https
xixingzhe216 小时前
Nginx 看懂请求耗时瓶颈
服务器·前端·nginx
北风toto19 小时前
Windows 下用 OpenSSL 生成 SSL 密钥并配置 Nginx 教程
windows·nginx·ssl
卜锦元20 小时前
Docker Compose 部署 Nginx 1.30.6 完整指南
nginx·docker·容器
小小龙学IT1 天前
Nginx 开源 Web 服务器与反向代理深度解
前端·nginx·开源
青瓦梦滋1 天前
【在线五子棋对战】游戏匹配模块
网络·c++·网络协议·http·https
zxanz11 天前
一张 SSL 证书,如何降低业务流量劫持与数据泄露风险
网络·网络协议·ssl
Coisinier2 天前
docker命令管理镜像及容器
linux·运维·nginx·docker·容器·操作系统
2301_32241428042 天前
基于web的校园失物招领管理系统59695-计算机毕设 原创(免费领源码+部署教程+开发环境)
mysql·nginx·php·apache·thinkphp·phpstudy·wampserver
梦帮科技2 天前
Web 漏洞攻防深度:WAF 规则逃逸技术(畸形分块传输、双重编码)与对抗加固
linux·前端·网络安全·ssl·web