/ 46浏览

Centos 通过Certbot申请通配符HTTPS证书,并自动续订

image-20240903140458-apil3jl

要在CentOS上通过Certbot申请通配符HTTPS证书并设置自动续订,请按照以下步骤操作:

  1. 安装Certbot

    • 首先确保你的系统是最新的,运行以下命令:

      sudo yum update -y
      
    • 安装Certbot:

      sudo yum install certbot -y
      
    • 确认Certbot版本是否为0.22以上,这是申请通配符证书所需的最低版本:

      certbot --version
      
  2. 申请通配符证书

    • 使用以下命令申请证书,将*.yourdomain.com​替换成你的域名:

      certbot certonly -d *.yourdomain.com --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory
      
    • 这个命令会提示你添加一个DNS TXT记录来验证域名的所有权。你需要登录到你的DNS提供商的控制面板,添加相应的TXT记录。

  3. 验证DNS记录

    • 添加DNS记录后,等待DNS记录生效。可以使用以下命令来检查TXT记录是否生效:

      dig -t txt _acme-challenge.yourdomain.com
      
  4. 完成证书申请

    • 一旦DNS记录生效,返回到命令行,按下回车键继续。Certbot将会验证TXT记录,如果验证成功,将会颁发证书。
  5. 安装证书

    • 证书申请成功后,你需要将证书安装到你的Web服务器。如果你使用的是Nginx,可以创建一个新的Nginx配置文件或者修改现有的配置文件,指向Certbot生成的证书文件:

      server {
          server_name *.yourdomain.com;
          listen 443 ssl;
          ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
          ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
          ...
      }
      
  6. 设置自动续订

    • Certbot默认会每天检查证书是否需要续订。你可以创建一个cron job来确保自动续订:

      sudo crontab -e
      
    • 在打开的编辑器中添加以下行来每天自动检查和续订证书:

      0 0,12 * * * /usr/bin/certbot renew --quiet
      
  7. 测试续订

    • 你可以运行以下命令来测试续订过程是否正常工作:

      sudo certbot renew --dry-run
      

以上步骤应该能够帮助你在CentOS上成功申请并自动续订通配符HTTPS证书。如果在操作过程中遇到任何问题,可以参考Certbot的官方文档或者搜索到的相关文章获取更多帮助。


第5步给出完整配置文件

当然,以下是一个完整的Nginx配置文件示例,用于安装和使用通过Certbot申请的通配符证书。请确保将yourdomain.com​替换为你的实际域名。

server {
    listen 80;
    server_name *.yourdomain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name *.yourdomain.com;

    # 证书文件路径
    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

    # 强烈建议的SSL配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # 启用HSTS
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    # 配置SSL Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
    ssl_trusted_certificate /etc/letsencrypt/live/yourdomain.com/chain.pem;

    # 配置日志文件
    access_log /var/log/nginx/yourdomain.com.access.log;
    error_log /var/log/nginx/yourdomain.com.error.log;

    # 网站根目录
    root /var/www/yourdomain.com/html;

    # 默认页面
    index index.html index.htm;

    # 配置代理,如果你的网站是动态的,比如使用了Django、Flask等
    location / {
        try_files $uri $uri/ =404;
        # 代理到后端应用服务器
        # proxy_pass http://127.0.0.1:8000;
    }

    # 配置静态文件的缓存
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 30d;
    }

    # 配置SSL重定向
    if ($ssl_protocol = "") {
        return 301 https://$host$request_uri;
    }
}

在这个配置文件中:

  • 第一个server​块用于将所有的HTTP请求重定向到HTTPS。
  • 第二个server​块用于处理HTTPS请求,并配置了SSL证书和相关的安全设置。
  • ssl_certificate​和ssl_certificate_key​指向Certbot生成的证书文件。
  • ssl_trusted_certificate​和ssl_stapling​用于启用OCSP Stapling,这可以提高SSL握手的效率。
  • root​和index​指令指定了网站的根目录和默认页面。
  • location /​块用于处理对网站根目录的请求,你可以在这里配置代理,将请求转发到后端应用服务器。
  • location ~* \.(jpg|jpeg|png|gif|ico|css|js)$​块用于设置静态文件的缓存过期时间。

请根据你的实际需求调整这个配置文件。一旦配置完成,你需要重新加载Nginx以应用新的配置:

sudo nginx -t # 检查配置文件是否有语法错误
sudo systemctl reload nginx # 重新加载Nginx配置

确保在进行任何更改之前备份你的原始Nginx配置文件。


我如果有两个子域名的话,要如何配置

如果你有两个子域名,例如 sub1.yourdomain.com​ 和 sub2.yourdomain.com​,并且你已经为 *.yourdomain.com​ 通配符证书申请了SSL证书,你可以在Nginx配置文件中为每个子域名设置不同的服务器块。这样,你可以根据需要为每个子域名提供特定的配置。

以下是一个示例配置,展示了如何为两个子域名设置服务器块:

# 子域名 sub1 的服务器块
server {
    listen 80;
    server_name sub1.yourdomain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name sub1.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

    # 其他 SSL 配置...

    root /var/www/sub1/html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    # 其他配置...
}

# 子域名 sub2 的服务器块
server {
    listen 80;
    server_name sub2.yourdomain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name sub2.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

    # 其他 SSL 配置...

    root /var/www/sub2/html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    # 其他配置...
}

# 捕获所有其他子域名的服务器块
server {
    listen 80;
    server_name *.yourdomain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name *.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

    # 其他 SSL 配置...

    root /var/www/default/html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    # 其他配置...
}

在这个配置中:

  • 每个子域名 sub1.yourdomain.com​ 和 sub2.yourdomain.com​ 都有自己的服务器块,用于处理HTTP和HTTPS请求。
  • 每个子域名的服务器块都有自己的 root​ 和 index​ 指令,指向各自的网站内容目录。
  • 一个通用的服务器块用于捕获所有其他可能的子域名,并提供默认的网站内容。

确保在进行任何更改之前备份你的原始Nginx配置文件,并且在应用新配置之前检查配置文件的语法是否正确:

sudo nginx -t # 检查配置文件是否有语法错误
sudo systemctl reload nginx # 重新加载Nginx配置

这样,你就可以为每个子域名提供特定的配置,同时确保所有子域名都使用相同的SSL证书。


子域名 443 nginx配置中也是填写通配符的证书吗?

是的,对于子域名,你仍然可以使用通配符证书(例如 *.yourdomain.com​)在Nginx配置中。通配符证书允许你为一个域名及其所有子域名提供SSL加密,而不需要为每个子域名单独申请证书。

在Nginx配置中,你可以为每个子域名设置一个server​块,并且每个server​块都可以使用相同的通配符证书。这里是一个简化的示例,展示了如何为两个子域名sub1.yourdomain.com​和sub2.yourdomain.com​使用相同的通配符证书:

# 子域名 sub1 的服务器块
server {
    listen 80;
    server_name sub1.yourdomain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name sub1.yourdomain.com;

    # 使用通配符证书
    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

    # SSL 配置...
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    root /var/www/sub1/html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    # 其他配置...
}

# 子域名 sub2 的服务器块
server {
    listen 80;
    server_name sub2.yourdomain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name sub2.yourdomain.com;

    # 使用通配符证书
    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

    # SSL 配置...
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    root /var/www/sub2/html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    # 其他配置...
}

在这个配置中:

  • 每个子域名都有自己的HTTP到HTTPS重定向规则。
  • 每个子域名的HTTPS服务器块都使用相同的通配符证书文件路径。
  • ssl_certificate​和ssl_certificate_key​指向通配符证书的路径,这些证书文件由Certbot生成并管理。

确保在应用新配置之前检查配置文件的语法是否正确,并重新加载Nginx以应用更改:

sudo nginx -t # 检查配置文件是否有语法错误
sudo systemctl reload nginx # 重新加载Nginx配置

这样,你就可以确保每个子域名都通过SSL/TLS安全地提供服务,而不需要为每个子域名单独管理证书。

image-20240901223310-78s6ipt