域名https证书申请

记录一下https 证书申请的详细步骤

0.前提

  • 本文基于云主机系统: Ubuntu
  • 域名已经配置好了DNS解析,即 指向了云主机的公网IP
  • 具备Nginx 运行环境
  • 申请的域名: abc.com

1.安装certbot

sudo apt install certbot

certbot --version

另,certbot详细安装可以参考 instructions

2.申请证书

# 可查看当前主机上已有证书信息,包含证书名,包含域名,过期时间,保存路径 等等
sudo certbot certificates

2.1 创建验证文件

# 构建用于证书验证的访问目录
sudo mkdir -p /var/www/abc.com/.well-known/acme-challenge
sudo touch /var/www/abc.com/.well-known/acme-challenge/hello
sudo echo "hello" > /var/www/abc.com/.well-known/acme-challenge/hello

2.2 配置nginx


server {
    listen 80;
    server_name abc.com;

    location /.well-known/acme-challenge/ {
        root /var/www/$host;
        allow all;
    }
    location / {
        return 301 https://$host$request_uri;   # HTTP 重定向到 HTTPS
    }
}

server {
    listen 443 ssl;
    server_name abc.com;
    
    # 先暂时注销. 因为这些目录还未创建
    #ssl_certificate /etc/letsencrypt/live/abc.com/fullchain.pem;
    #ssl_certificate_key /etc/letsencrypt/live/abc.com/privkey.pem;

    # 其他配置(根目录、代理等)...
}
  • 以上主要内容修改或者新建到 nginx_abc.conf 文件
# 检查新的配置是否
sudo nginx -t
# 重新加载配置
sudo nginx -s reload
# 确认 certbot验证请求的path
curl -v "http://abc.com/.well-known/acme-challenge/hello"

2.3 获取证书

# 获取证书
sudo certbot certonly --manual -d "abc.com" --preferred-challenges http

参数含义

  • certonly: 仅获取证书,不自动修改Nginx的配置。证书默认保存在 /etc/letsencrypt/live/
  • --manual: 手动模式。申请过程会一步步提示需要执行哪些手动操作。
  • -d "abc.com": 指定申请证书的域名
  • --preferred-challenges http: 指定验证方式优先使用 HTTP-01 challenge。即 Certbot 会要求在 Web 服务器的 http://<域名>/.well-known/acme-challenge/ 路径下放置一个特定的验证文件,Let's Encrypt 的服务器通过公网访问该文件来确认您拥有域名的控制权

http验证流程

  1. Certbot 向 Let's Encrypt 发起申请
  2. Certbot 提示:在 Web 服务器的指定目录下创建一个文件(包含特定内容)
  3. 需要手动创建该文件(例如:/var/www/<something>/.well-known/acme-challenge/xxxx)
sudo touch /var/www/abc.com/.well-known/acme-challenge/xxxx
sudo echo "xxxxxx" > /var/www/abc.com/.well-known/acme-challenge/xxxx
  1. 确保 http://abc.com/.well-known/acme-challenge/xxxx 可以公网访问;
  2. Certbot 验证通过后,颁发证书。

按照提示操作,一路enter即可
再次查看主机上的证书

sudo certbot certificates

3.配置&验证证书

  • 启用nginx证书配置
 server {
    listen 443 ssl;
    server_name abc.com;
    
    # 放开注释
    ssl_certificate /etc/letsencrypt/live/abc.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/abc.com/privkey.pem;

    # 其他配置(根目录、代理等)...
}
  • 重加载配置
sudo nginx -t
sudo nginx -s reload
  • https 请求域名
curl -v "https://abc.com"

PATCH

一个问题: 在前面的获取证书命令 certbot certonly --manual 是手动模式,Certbot 会强制把验证方式写入配置文件为 manual,且要求每次续订时人工干预。 免费证书时长为90天,一直人工续订不方便,而且Certbot是可以自动续订的。 我们只要使用 --webroot 参数重新签发(或覆盖)证书即可

# 模拟运行
sudo certbot certonly --webroot -w /etc/letsencrypt/renewal/abc.com.conf -d abc.com --dry-run
  • --dry-run 模拟运行,可以检查命令是否ok。看到 The dry run was successful 后,再执行前面带 --force-renewal 的正式命令
  • 去掉 --manual 这是最关键的,只要用了 --webroot, Certbot 就不会再往配置文件里写 manual
  • --force-renewal 强制用新方式重新签发证书,执行成功后,Certbot自动覆盖配置文件
  • -w webroot_path 配置文件的路径
  • --preferred-challenges http 无需添加。--webroot 默认就使用 http-01 验证,写不写都一样
# 强制重新签发运行
sudo certbot certonly --force-renewal --webroot -w /etc/letsencrypt/renewal/abc.com.conf -d abc.com
# 检查证书实际有效期,应该是最新订阅的
sudo certbot certificates

确认 Certbot 自动更新状态正常

# 检查定时器状态
sudo systemctl status certbot.timer
# 检查历史执行日志
sudo journalctl -u certbot.service

# 查看 Certbot日志
sudo tail -50 /var/log/letsencrypt/letsencrypt.log

如果一切正常的话,Certbot 就可以自动运行,续订证书了。