cerbot 实现通配符子域名证书+续期

文章目录

之前写过一篇docker环境下配置cerbot获取免费ssl证书并自动续期

是单个域名的方式,实现颁发证书和续期的,如果添加子域名还得需要重新操作,那么有没有通配符的方式实现一劳永逸呢

答案: 有

本文来操作下通配符方式证书和续期

参考链接:

通配符证书: https://developer.aliyun.com/article/713724

实现原理

本质上还是通过certbot通过脚本方式向 Let's Encrypt 机构颁发和更新 SSL/TLS 证书。

单个域名和通配符的区别是: 前者通过 nginx的配置location规则来,通配符需要通过设置dns在域名上添加txt规则来验证

具体操作

实验操作环境为centos7

1.下载certbot

yum update -y
yum install certbot -y

2.申请RSA通配符证书命令

certbot -d XXX.com -d *.XXX.com --manual --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory certonly --agree-tos --register-unsafely-without-email

这里可以只写子域名,如果像包括根域名可以使用-d也加上。如果一个-d只需要配置一个txt规则,如果是2个-d配置2个txt规则。
解释

--register-unsafely-without-email : 跳过邮箱验证

3.添加txt规则

上面的命令输出完完后,会有txt记录,

在阿里云或者自己的域名服务器上配置下。

进入自己域名的DNS记录管理页面,增加两条TXT记录,多数情况下,仅需在域名(Name)处填入_acme-challenge,在内容(Target)处填入上一步Certbot生成的内容即可(记得填写两个,多个文本记录之间以换行符(Enter键)分隔),不同DNS提供商处可能会略有不同,根据实际情况修改:

当查看TXT记录解析成功后,回到申请证书的 Press Enter to Continue 处,直接回车。成功会有下面的提示:

配置文件下在/etc/letsencrypt/live/xxx.com/里面:

说明证书已颁发成功。

3. 配置nginx

下面是一个nginx应用该证书的一个例子

复制代码
server {
    server_name xxx.com;
    listen 443 http2 ssl;
    ssl on;
    ssl_certificate /etc/cert/xxx.com/fullchain.pem;
    ssl_certificate_key /etc/cert/xxx.com/privkey.pem;
    ssl_trusted_certificate  /etc/cert/xxx.com/chain.pem;

    location / {
      proxy_pass http://127.0.0.1:8080;
    }
}

因为我的nginx是用docker部署的,这里略有不同,需要使用容器卷,地址写nginx容器内的路径。

我这里随便找个子域名测试下:

shell 复制代码
#a
server {
    listen       80;
    listen [::]:80;
    server_name  a.xxx.com www.a.xxx.com;
    server_tokens off;
    gzip on;
    gzip_static on;
    gzip_buffers 4 16k;
    gzip_comp_level 5;
    gzip_types text/plain application/javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;


    location / {
        return 301 https://a.xxx.com$request_uri;
    }

  
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}


# 处理https请求
server {
    listen 443 ssl;
    server_name  a.xxx.com;

    server_tokens off;

    # /etc/letsencrypt/live/xxx.com/fullchain.pem; 路径根据自己的实际情况填写
    ssl_certificate /etc/nginx/ssl/child-xxx/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/child-xxx/privkey.pem;
    ssl_trusted_certificate  /etc/nginx/ssl/child-xxx/chain.pem;

    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    # root /usr/share/nginx/html;
    # index index.html;

    location / {
        proxy_pass http://x.x.x.x:18080/;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

4.续期

命令如下: certbot renew

证书3个月有效期,在过期时执行就可以了。

因为没有过期,所以显示不能renew。

5.自动续期

编写个renew_cert.sh脚本

shell 复制代码
#!/bin/bash

certbot renew

90天一次

0 0 */90 * * /root/cert-scripts/child-xxx/renew_cert.sh


正常这样就可以了,我的renew_cert.sh还需要添加文件拷贝到nginx容器的操作,就不展示了。


文章难免有错误之处,如有,欢迎交流和指正。

下面是我的公众号,以后文章会同步更新,有需要的可以订阅。谢谢。

相关推荐
MyFreeIT1 天前
Let‘s Encrypt SSL 製作免費證書
网络协议·https·ssl
00后程序员张1 天前
Android证书绑定抓包失败?Android SSL Pinning绕过实战指南
android·网络协议·计算机网络·网络安全·adb·https·ssl
武帝为此1 天前
【TLS SSL 介绍】
网络·网络协议·ssl
吠品4 天前
SQL Server 版本查询的几种实用方法
数据库·网络协议·ssl
瓦格哈儿5 天前
内网环境也需要证书?聊聊内网 IP 证书的适用边界
网络协议·ssl
CZIDC6 天前
华为服务器TS200-2280 V2 iBMC导入SSL证书后问题案例分析
服务器·https·ssl
m0_617493948 天前
SSLError [ASN1: NOT_ENOUGH_DATA] 问题排查与解决指南
python·ssl
左钦杨9 天前
如何剩下一笔SSL(https)证书的钱?
网络协议·https·ssl
就叫飞六吧12 天前
Cloudflare 免费 SSL 证书与兼容端口列表科普
网络协议·iphone·ssl
2601_9670195112 天前
关于SSL和TLS的常见问题解答
ssl