let’s encrypt 申请免费ssl证书
Let’s Encrypt 是一家免费提供 TLS 证书的证书颁发机构,简化了网站开启 HTTPS 加密的流程,从而为所有人构建更加安全的互联网,Let’s Encrypt 颁发的证书已被所有主流浏览器和操作系统广泛信任,这对于个人开发者、中小型企业乃至大型网站来说,都是一个非常可靠且经济实惠的安全加密选择
Let’s Encrypt 通过 ACME 协议接口自动签发数字证书,调用 Let’s Encrypt 接口获取证书需要使用一种名为“ACME 客户端”的软件,推荐使用的 ACME 客户端是 Certbot, 其网站提供了优质的文档和操作说明
使用 Certbot 自动获取和管理 Let’s Encrypt 的免费 SSL 证书前,需要确保满足一些基本条件
- 运行 Linux 系统(如 Ubuntu、CentOS 等)
- 拥有一个或多个域名,且 DNS 已正确解析到你的服务器公网 IP
- 已经安装并运行Nginx或Apache
- 网站开放80端口
- 拥有root权限
- 服务器可以上网
签发数量:
- 单域名:每 7 天最多只能签发 50 张包含该域名的证书
- 通配符:每个域名每周最多签发 5 张通配符证书
证书有效期:
- 3个月
签发证书类型:
- ECC(椭圆曲线):新版本的 Certbot(v2 及以上)默认使用 ECC 证书,通常是
secp256r1(P-256),采用新一代椭圆曲线加密,具有安全性更高、密钥尺寸更小、握手速度更快等优点,是现代证书的首选曲线 - RSA:经典的 RSA 算法,兼容性最广泛,几乎所有设备和软件都支持
注:如果提示不支持ECC,就要在申请的时候指定RSA,最下面有教程
安装certbot
1、安装snapd,通过snapd来安装certbot,如下:
apt install snapd
2、安装certbot,如下:
snap install --classic certbot
3、添加软链接:
ln -s /snap/bin/certbot /usr/bin/certbot
4、运行命令获取证书,如下:
certbot certonly --nginx
或
certbot certonly --webroot -w /usr/share/nginx/html -d abcd.i-yin.net
上述两个命令区别如下:
| 特性 | certbot certonly –nginx | certbot certonly –webroot(推荐) |
| 适用 Web 服务器 | 仅 Nginx | 任何 Web 服务器(Nginx/Apache等) |
| 自动化程度 | 高(自动修改 Nginx 配置) | 低(需手动配置 Web 服务器) |
| 适合场景 | 简单 Nginx 环境 | 复杂环境、Docker、多服务器 |
| 是否需要 root 权限 | 是(需修改 Nginx 配置) | 是(需写入 webroot 目录) |
| 推荐使用情况 | 新手、单 Nginx 服务器 | 高级用户、生产环境 |
二者不能混用,--nginx会自动修改配置,而 --webroot需手动配置。选择一种模式即可
获取单域名证书
本案例中使用获取证书的命令为certbot certonly –webroot
1、准备好一个外网域名,解析到公网IP上,内部安装nginx,并启用80端口,自定义一个页面,如下:

注意:此时先不用搞443,因为还没申请证书,必须要有外网可以访问的域名,因为Let’s Encrypt要通过此域名访问来验证文件
2、在网站根目录下创建文件夹.well-known/acme-challenge,并给目录以及子目录777权限,如图:
mkdir -p /usr/share/nginx/html/.well-known/acme-challenge #我的nginx根目录为/usr/share/nginx/html
chmod -R 777 .well-known

注:创建目录以及赋权都是为后续生成验证文件做准备,否则会因为权限导致无法验证
3、执行命令获取证书,如下:
certbot certonly --webroot -w /usr/share/nginx/html -d abcd.i-yin.net
- -w :指定网站根目录位置,验证文件会放到此目录进行验证
- -d:指定要获取证书的域名
执行成功后内容如图:

证书文件和密钥文件存储在/etc/letsencrypt/archive/abcd.i-yin.net目录下,如图:

4、刷新网站,查看证书,颁发机构为Let’s Encrypt,如图:

注:certbot要和Nginx在同一台机器上,因为获取证书的时候,会自动下载验证文件到nginx的网站根目录下,如果不在一台机器上,验证会失败,如果有多个单域名要验证,就要创建多个nginx的配置文件,要保证每个域名的验证文件可以访问(可以自己在.well-known/acme-challenge目录下创建文件来访问验证下)
如果有多个域名需要申请证书,可以将路径和域名放在一起执行,如下:
certbot certonly --webroot -w /usr/share/nginx/html -d abcd.i-yin.net -w /usr/share/nginx/html/defg -d defg.i-yin.net
注:一行命令给多个域名分配证书,此时会将所有域名合并到一张证书中,如果要每个域名证书单独分开,就需要多次执行certbot命令才行
注: 单域名也可以通过自动DNS或者手动方式来验证,可以参考下面的通配符获取命令,把通配符那个域名去掉就行
续期
执行续期命令,如下:
certbot renew --cert-name abcd.i-yin.net
在证书有效期小于30天的时候,续费才会生效,否则如果执行续期命令会直接跳过,如图:

如果验证续期流程是否正常,可以执行如下测试命令:
certbot renew --cert-name abcd.i-yin.net --dry-run

通配符证书
Certbot 可以获取 Let’s Encrypt 的通配符证书(Wildcard Certificate),但需要使用 DNS-01 验证方式(文件验证无法适用通配符)
作用:
- 匹配所有子域名:例如
*.example.com可以用于blog.example.com、api.example.com、dev.example.com - 不匹配主域名:
*.example.com不包含example.com,如果需要主域名,必须单独添加(-d example.com -d *.example.com)
前提条件:
- 必须使用 DNS-01 验证(通过添加 DNS TXT 记录验证域名所有权)
- 需要域名提供商支持 API 自动更新 DNS(如 Cloudflare、AWS Route53、Aliyun DNS 等),或者手动添加 TXT 记录
- Certbot 版本 ≥ 0.22.0(较新版本支持通配符)
版本:
- certbot : 5.0.0
- certbot-dns-aliyun : 2.0.0 (pip3 show certbot-dns-aliyun 命令查看)
手动添加DNS步骤:
手动添加DNS适合于域名和你要解析的云厂商不一样的情况,比如我的域名是在京东云购买的,但是certbot只支持阿里云的DNS插件,此时是不能使用自动DNS解析的,只有你的域名在你连接的DNS插件对应的阿里云账号上的时候才可以使用自动解析
1,获取通配符证书命令,如下:
#通配符不匹配主域名,因此ywdevops.cn要单独使用-d来申请证书
certbot certonly --manual --preferred-challenges dns -d "ywdevops.cn" -d "*.ywdevops.cn"
会提示需要去域名控制台添加TXT的解析记录,如图:

登录域名控制台,添加记录,如图:

解析需要几分钟才能生效,此时先不要回车下一步,以免没检测到生效导致失败,此时通过命令先检测下解析是否成功,如果成功了在继续执行证书步骤,如下:
dig +short TXT _acme-challenge.ywdevops.cn @8.8.8.8

已经生效,此时在Press Enter to Continue位置点击回车进行下一步,获取到证书,如图:

将证书配置到Nginx后,查看网站证书信息 , 已经是Let’s Encrypt, 如图:

查看获取的证书中是否包含多个域名,可以使用如下命令:
openssl x509 -in fullchain1.pem -noout -text | grep -A1 "Subject Alternative Name"
如下图 , 此证书中包含了一个通配符证书,和一个主域名证书

自动DNS解析步骤
1、使用 Certbot 的 DNS 插件(推荐,自动更新 DNS),这里演示使用阿里云DNS插件,安装插件,如下:
python3 -m venv /data/pyproject/test //创建虚拟环境,跟外面隔离开
source /data/pyproject/test/bin/activate //激活
pip3 install certbot certbot-dns-aliyun //安装certbot和插件
certbot plugins //验证插件

2、配置阿里云 AccessKey 凭证,如下:
- 登录阿里云账号,创建RAM用户
- 创建AccessKey ID 和 AccessKey Secret,保存好
- 给用户授予
AliyunDNSFullAccess策略

3、在服务器上创建配置文件/etc/letsencrypt/aliyun.ini,如下:
touch /etc/letsencrypt/aliyun.ini
chmod 600 aliyun.ini #权限控制在600
添加配置内容到aliyun.ini中,如下:
dns_aliyun_access_key = LTAI5tAoMeLxFa5boBcjWJs
dns_aliyun_access_key_secret = MP9CGqB98zaHN0t0BOpW9G2cMhfBAw
4、使用命令获取证书 , 如下:
certbot certonly \
--authenticator dns-aliyun \
--dns-aliyun-credentials /etc/letsencrypt/aliyun.ini \
--dns-aliyun-propagation-seconds 60 \
-d "*.example.com" \
-d example.com \
--non-interactive \
--agree-tos \
-m 123@qq.com
登录阿里云,可以看到已经自动添加了DNS解析,如图:

再等一会就可以看到终端提示证书签发成功,如图:

注: 要获取证书的域名要跟aliyun.ini中配置AccessKeyID和AccessKeySecret所对应的阿里云账号在一起才能使用自动DNS解析
续期
1、执行如下命令续费自动DNS验证的证书和文件验证的单域名证书:
# 1. 立即试运行(不真续)
certbot renew --dry-run
# 2. 若 dry-run 通过,正式续期
certbot renew
Certbot 会读取 /etc/letsencrypt/renewal/*.conf,针对配置文件中的域名信息来续期
注 : 这种自动续费方式只支持单域名方式的文件验证, 单域名自动DNS验证,多域名自动DNS验证
2, 手动续费(域名在其他云厂商上,但是certbot不支持此厂商的DNS插件),如下:
certbot renew --manual --preferred-challenges dns
根据自己需要进行选择即可

注意: 证书只有小于30天的时候才能续期
重要!!!!!
如果生成的证书需要上传到阿里云上,需要指定证书类型为RSA才行,否则会提示ECC证书不受支持,命令如下:
certbot certonly --manual --key-type rsa --rsa-key-size 2048 --preferred-challenges dns -d "abcd.com" -d "*.abcd.com"


