用户基于  ACME  协议  和  Certbot  自动申请与续签  Let’s  Encrypt  SSL证书,是当前最主流、最可靠的  HTTPS  证书自动化管理方案。下面我会从原理到实践,完整说明一下整个流程。

一、ACME  协议与  Let’s  Encrypt

ACME(Automatic  Certificate  Management  Environment)  是由  Let’s  Encrypt  推动的自动化证书管理协议,允许客户端(如  Certbot)与  CA(证书颁发机构)交互,自动完成域名验证、证书申请、续签等操作,无需人工干预。

Let’s  Encrypt  是一个免费、开放、自动化的  CA,完全遵循  ACME  协议,提供  90  天有效期的  SSL/TLS  证书,并鼓励自动化续签。

二、Certbot  简介

Certbot  是  EFF(电子前哨基金会)官方推荐的  ACME  客户端,功能完善,支持主流  Web  服务器(Nginx、Apache)的自动配置,也支持  standalone  模式手动验证域名所有权。它可以自动申请、安装、续签证书,并配置  Web  服务器使用  HTTPS。

三、准备工作

1.  一个已解析到服务器的域名(如  `example.com`)。

2.  服务器上的  80  端口(HTTP)和  443  端口(HTTPS)需要能够从外网访问,因为  Let’s  Encrypt  的验证服务器需要访问你的服务器进行域名验证。

3.  服务器操作系统:本文以  Ubuntu  22.04  LTS  为例,其他  Linux  发行版类似。

四、安装  Certbot

1.  更新系统包

bash

sudo  apt  update

sudo  apt  upgrade  -y

2.  安装  Certbot  及对应插件

根据你使用的  Web  服务器选择插件:

  Nginx:`sudo  apt  install  certbot  python3-certbot-nginx`

  Apache:`sudo  apt  install  certbot  python3-certbot-apache`

  通用(不使用插件):`sudo  apt  install  certbot`

如果你还没有安装  Web  服务器,可以先安装:

bash

#  安装  Nginx

sudo  apt  install  nginx  -y

#  或安装  Apache

sudo  apt  install  apache2  -y

五、申请证书

Certbot  提供多种验证方式,最常用的是  Webroot  模式(利用已有  Web  服务器验证)和  Standalone  模式(临时占用  80  端口验证)。下面分别介绍。

方式一:使用  Nginx  插件(自动配置)

如果你的  Web  服务器是  Nginx,且已经正确配置了域名站点,可以用此方式一步完成申请和配置:

bash

sudo  certbot  --nginx  -d  example.com  -d  www.example.com

`--nginx`:使用  Nginx  插件。

  `-d`  参数指定域名(可多个)。

执行后  Certbot  会交互式询问邮箱(用于紧急通知)、是否同意服务条款等。之后自动获取证书并修改  Nginx  配置,启用  HTTPS。

方式二:使用  Apache  插件(类似)

bash

sudo  certbot  --apache  -d  example.com  -d  www.example.com

方式三:Webroot  模式(手动配置)

如果你不想让  Certbot  自动修改  Web  服务器配置,或者使用其他  Web  服务器(如  Caddy),可以用  Webroot  模式。

1.  确保你的  Web  服务器已配置好  HTTP  站点(端口  80),且站点根目录可写。

2.  执行:

      bash

      sudo  certbot  certonly  --webroot  -w  /var/www/html  -d  example.com  -d  www.example.com

            `--webroot`:指定验证方式。

        `-w`:指定网站的根目录(多个域名可用多个  `-w`  指定不同根目录)。

3.  Certbot  会在根目录下创建  `.well-known/acme-challenge/`  临时文件,Let’s  Encrypt  服务器通过  HTTP  访问这些文件来验证域名所有权。验证通过后,SSL证书会保存到  `/etc/letsencrypt/live/example.com/`  目录。

方式四:Standalone  模式(临时占用端口)

如果服务器上暂时没有  Web  服务,或者  80  端口空闲,可以使用  standalone  模式:

bash

sudo  certbot  certonly  --standalone  -d  example.com  -d  www.example.com

Certbot  会临时启动一个  HTTP  服务(占用  80  端口)用于验证,验证完成后自动关闭。此方式需要确保  80  端口未被占用。

六、自动续签

Let’s  Encrypt  证书有效期为  90  天,Certbot  会在系统定时任务中自动检查并续签即将过期的证书(通常每天运行两次)。

1.  检查续签机制

安装  Certbot  后,它会自动创建定时任务:

systemd  timer(推荐):

    bash

    sudo  systemctl  list-timers  |  grep  certbot

    你会看到类似  `certbot.timer`  的服务,默认每天两次运行  `certbot  renew`。

  cron  任务(旧版本):

    bash

    sudo  crontab  -l  |  grep  certbot

    通常会有类似  `0  0,12  *  *  *  ...  certbot  renew`  的条目。

2.  手动测试续签

你可以随时手动运行续签命令,测试是否正常:

bash

sudo  certbot  renew  --dry-run

如果输出显示  `The  dry  run  was  successful`,说明自动续签配置正确。

3.  续签后自动重启  Web  服务器

默认情况下,Certbot  在续签后会自动执行一些钩子来重载  Web  服务器配置。如果你的  Web  服务器不是  Nginx/Apache,或者需要额外操作,可以在  `/etc/letsencrypt/renewal/`  对应的配置文件中添加  `renew_hook`。

例如在续签后重启  Nginx:

bash

sudo  certbot  renew  --renew-hook  "systemctl  reload  nginx"

通常插件会自动处理,无需手动干预。

七、验证证书状态

查看证书信息:

bash

sudo  certbot  certificates

输出会列出所有已申请的证书,包括域名、有效期、证书路径等。

八、常见问题与注意事项

1.  防火墙开放端口    

      确保  80  和  443  端口已开放:

      bash

      sudo  ufw  allow  80/tcp

      sudo  ufw  allow  443/tcp

2.  域名解析正确    

      域名必须解析到服务器的公网  IP,否则验证会失败。

3.  多个域名    

      可以用  `-d`  参数添加多个域名,证书会同时包含这些域名(SAN  证书)。

4.  通配符证书    

      如需  `*.example.com`  这样的泛域名证书,必须使用  **DNS  验证**(手动或通过  DNS  API),Certbot  支持多种  DNS  插件(如  `certbot-dns-cloudflare`)。例如:

      bash

      sudo  certbot  certonly  --dns-cloudflare  -d  *.example.com  -d  example.com

5.  证书文件位置    

      -  证书:`/etc/letsencrypt/live/域名/fullchain.pem`

      -  私钥:`/etc/letsencrypt/live/域名/privkey.pem`

      在  Web  服务器配置中应指向这些路径(如果是插件自动配置,则无需手动修改)。

九、总结

通过  Certbot  基于  ACME  协议与  Let’s  Encrypt  交互,我们可以实现:

-  一键申请免费  SSL证书

-  自动配置  Web  服务器启用  HTTPS;

-  自动续签证书,完全无需人工介入。

整个过程安全、免费、自动化,是当前部署  HTTPS  的最佳实践。如果你的服务器环境特殊(如容器化、非标准  Web  服务器),Certbot  也提供了灵活的扩展方式,如  DNS  验证、自定义钩子等。

如果用户在操作过程中遇到任何问题,欢迎提供更多细节,我可以帮用户进一步排查。