Https之ssl免费证书自建工具certbot使用

如何使用 Let's Encrypt

Certbot 是 Let's Encrypt 推荐的工具,用于自动化管理证书。

  • 1. 安装 Certbot

  • Ubuntu/Debian:
sudo apt update
sudo apt install certbot python3-certbot-apache

  • CentOS/RHEL:
sudo yum install epel-release
sudo yum install certbot python3-certbot-nginx

  • 2. 生成证书

根据你的 Web 服务器类型,选择适当的插件:

  • Nginx:需要nginx运行在80端口
sudo certbot --nginx
  • Apache:需要Apache运行在80端口
sudo certbot --apache
  • 独立模式(无 Web 服务器):
sudo certbot certonly --standalone

执行命令时,Certbot 会:

  • 验证你的域名所有权(通过 HTTP/HTTPS 或 DNS)。

  • 自动配置服务器以启用 HTTPS(如使用 Nginx 或 Apache 插件)。

  • 3. 验证 HTTPS 是否正常工作

使用浏览器访问你的域名,确保 HTTPS 正常运行并显示安全图标。

  • 4. 证书续期

Let's Encrypt 的证书有效期为 90 天,续期成功后可以不需要去重新部署证书

  • 验证续期命令是否有效

      sudo certbot renew --dry-run
    
    • renew:Certbot 会查找系统中已存在的证书,并尝试续订。
    • --dry-run:模拟续订过程,不影响现有证书,也不会更改证书文件。
  • 自动续期: 服务器可以开放80公网端口才可以使用(其实就是ACME验证服务器会发起一个http请求访问服务器);

    使用如下生成证书命令才可自动续期(就是利用crontab脚本跑命令):

    • nginx/apache: 需要运行在80端口 ;
    • standalone+http: certbot会自己运行一个HTTP服务在指定端口
      sudo certbot certonly --standalone --preferred-challenges http --http-01-port 8080 
    

    --http-01-port 参数的作用是让 Certbot 的临时服务器监听指定端口,但 ACME 协议仍要求验证请求通过 端口 80;

    ACME访问地址示例: http://www.example.com/.well-known/acme-challenge/a0FmtqlEMyDkwAONv3iy-SvyTDQOcXh-2Z4op6IskHs

    • 手动续期:
      • 手动执行自动续期的操作(服务器可以开放80公网端口才可以使用);
      • 使用 DNS 验证方法
        • 生成证书(不需要服务器):

            sudo certbot certonly --manual --preferred-challenges dns -d example.com -d *.example.com
          

          过程中会需要输入联系的邮箱,并要求到域名服务商的管理页面配置一条DNS解析记录:

            Please deploy a DNS TXT record under the name:
            _acme-challenge.example.com
            with the following value:
            abcd1234efgh5678ijkl91011mnopqrstu
          
          
          添加如下记录:
          • 记录名称(Host/Name): _acme-challenge.example.com
          • 记录类型(Type): TXT
          • 记录值(Value): abcd1234efgh5678ijkl91011mnopqrstu
          • TTL: 设置为最小值(如 10 分钟)。
        • 手动方式 DNS 续期:

          sudo certbot renew --manual --preferred-challenges dns --dry-run
        

        Certbot 会提示您在 DNS 中添加一条新的 TXT 记录。

特殊方案: 自动DNS验证方法续期

思路: DNS验证方法鉴权需要在域名服务商域名解析处
对数据: _acme-challenge.example.com 设置对应的记录值,
只需要域名服务商有支持修改域名解析的OpenApi即可

阿里云文档: https://help.aliyun.com/zh/dns/api-alidns-2015-01-09-updatedomainrecord

阿里云文档地址里面有调试功能,可以进去后调试好了直接下载代码使用

  • 鉴权脚本: update-domain.sh
#!/bin/bash

# 打印所有环境变量(用于调试)
echo "DEBUG: Environment variables:"
env | grep CERTBOT

# Certbot 提供的环境变量
DOMAIN=$CERTBOT_DOMAIN                              # 当前验证的域名: Certbot命令运行时自动的环境变量,按参数名读取即可
VALIDATION=$CERTBOT_VALIDATION                      # Let’s Encrypt 提供的验证值: Certbot命令运行时自动的环境变量,按参数名读取即可
DOMAIN_ID=883195266900000000                        # 阿里云域名RecordId: 可以在哪里云调试界面使用(DescribeDomainRecords - 获取解析记录列表)获取
ACCESS_KEY_ID=LTAI4GDiu2Yaaaaaaaaaaaaa              # 阿里云accessKeyId: 阿里云单独申请子账号获取
ACCESS_KEY_SECRET=uUuQ9O0aaaaaaaaaaaaaaaaaaaaaaa    # 阿里云accessKeySecret: 阿里云单独申请子账号获取,申请时记录好,后面不能查

# 本地 JAR 包路径: 使用阿里云调试获取的代码,自定义一次传入参数使用
JAR_PATH="/etc/letsencrypt/aliyun/ssl-certbot-1.0.0.jar"

# 调用 JAR 包更新 DNS
echo "Calling Java JAR to update DNS record..."  >> ./updomain.log
echo "java命令参数: "$JAR_PATH" "--accessKeyId=$ACCESS_KEY_ID"  "--accessKeySecret=$ACCESS_KEY_SECRET" "--domainId=$DOMAIN_ID"  "--domainVal=$VALIDATION" >> ./updomain.log
java     -jar     "$JAR_PATH" "--accessKeyId=$ACCESS_KEY_ID"  "--accessKeySecret=$ACCESS_KEY_SECRET" "--domainId=$DOMAIN_ID"  "--domainVal=$VALIDATION"
# 检查 Java 命令的退出码: Java异常确认
if [ $? -ne 0 ]; then
    log "Error: Failed to update DNS record using Java program."
    # 发送通知(例如通过邮件或钉钉机器人)
    # send_notification "DNS update failed for $DOMAIN"
    exit 1  # 终止脚本,Certbot 将报告失败
fi
# 等待 DNS 生效(可根据实际情况调整时间)
echo "Waiting for DNS propagation..."  >> ./updomain.log
sleep 30

echo "DNS record updated successfully for $DOMAIN"  >> ./updomain.log

  • certbot续期脚本: renew-example.sh

#!/bin/bash

# 申请域名*.example.com SSL证书续期
certbot certonly --manual --preferred-challenges dns  --agree-tos  --manual-auth-hook /etc/letsencrypt/aliyun/update-domain.sh   -d *.example.com --non-interactive   >> /etc/letsencrypt/logs/renew-example.log 2>&1
  • 命令解析

    certbot certonly
    启动 Certbot 以请求或续订证书,但只生成证书而不会安装到服务器中。
    适用于你需要手动安装证书到服务器或其他服务时。
    
    --manual
    使用手动模式,要求用户手动完成 DNS 验证过程。通常适用于自动化程度较低的环境。
    
    --preferred-challenges dns
    指定优先使用 DNS 验证方法。
    这种验证方式要求你在域名的 DNS 记录中添加一个 _acme-challenge 类型的 TXT 记录,以验证你对该域名的控制权。
    特别适用于申请通配符证书(如 *.example.com),因为通配符证书只能通过 DNS 验证方式完成。
    
    --agree-tos
    自动同意 Let's Encrypt 的服务条款,避免手动确认。
    适用于自动化脚本,跳过服务条款提示。
    
    --manual-auth-hook /etc/letsencrypt/aliyun/update-domain.sh
    指定一个自定义脚本(update-example.sh)来处理 DNS 验证过程。
    这个脚本通常会自动更新 DNS 服务商的记录,例如在阿里云、腾讯云等平台添加 _acme-challenge 的 TXT 记录。
    Certbot 在执行过程中会自动调用该脚本,并将验证值(通过环境变量如 $CERTBOT_VALIDATION 提供)传递给它。
    
    -d *.example.com
    指定申请的域名,这里是 *.example.com,表示申请一个通配符证书。
    通配符证书允许为所有子域(如 www.example.com、api.example.com)提供 HTTPS 支持。
    
    --non-interactive
    禁止所有用户交互,确保命令在完全自动化的环境中运行。
    如果某个操作需要用户输入,Certbot 会直接退出而不会暂停等待输入。
    
    >> /etc/letsencrypt/logs/renew-example.log 2>&1
    将命令的输出(包括标准输出和标准错误)追加到日志文件 renew-example.log 中,以便后续查看执行过程和可能的错误信息。
    >> 表示追加(而不是覆盖)日志。
    
    2>&1 
    表示将标准错误(文件描述符 2)重定向到标准输出(文件描述符 1)。

首次申请ssl证书时, 可以先运行命令

certbot certonly --manual --preferred-challenges dns   --manual-auth-hook /etc/letsencrypt/aliyun/update-example.sh   -d *.example.com   --verbose
    --verbose 参数以启用详细模式:
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,110评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,443评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,474评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,881评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,902评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,698评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,418评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,332评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,796评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,968评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,110评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,792评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,455评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,003评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,130评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,348评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,047评论 2 355

推荐阅读更多精彩内容