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 –nginxcertbot 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.comapi.example.comdev.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"

标签