域名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"