Let’s Encrypt 免费证书获取方法
一、Let’s Encrypt证书前置需求
- 域名所有者:Let’s Encrypt 是一个证书颁发机构(CA), 要从 Let’s Encrypt 获取网站域名的证书,必须证明对域名的实际控制权。
- ACME 协议软件 : 在Let’s Encrypt 使用 ACME 协议来验证对给定域名的控制权并颁发证书, 要从Let’s Encrypt 获得证书,需要选择一个要使用的 ACME 客户端 Certbot 、或者使用得最多的 acme.sh。
二、证书兼容性
参考来源:https://letsencrypt.org/zh-cn/docs/certificate-compatibility/
- 信任ISRG RootX1的平台
● Windows >= XP SP3 (如果自动 Root 证书更新没有手动禁用的话)
● macOS >= 10.12.1
● iOS >= 10 (不包括 iOS 9)
● iPhone 5 及更新的手机可以升级到 iOS 10 ,因此可以信任ISRG Root X1
● Android >= 7.1.1 (由于我们的特殊交互签名证书,安卓 >= 2.3.6 默认情况下可信任)
● Mozilla Firefox >= 50.0
● Ubuntu >= Precise Pangolin / 12.04(安装更新后)
● Debian >= jessie / 8 (安装更新后)
● Java 8 >= 8u141
● Java 7 >= 7u151
● NSS >= 3.26
浏览器(Chrome、Safari、Edge、Opera) 一般都信任他们所运行于的操作系统的根证书。 Firefox 是例外:它有自己的根证书列表。 不久,Chrome的新版本将 也有自己的根证书列表。 - 信任DST Root CA X3但不信任ISRG Root X1的平台
这些平台在2021年9月前可以使用, 但是现在不再验证 Let’s Encrypt 证书。
● macOS < 10.12.1
● iOS < 10
● Mozilla Firefox < 50
● Ubuntu >= intrepid / 8.10
● Debian >= squeeze / 6, < jessie /8
● Java 8 >= 8u101, < 8u141
● Java 7 >= 7u111, < 7u151
● NSS >= v3.11.9, < 3.26
● Amazon FireOS (Silk Browser) (版本范围未知)
● Cyanogen > v10 (添加 ISRG Root X1 信任的版本未知)
● Jolla Sailfish OS > v1.1.2.16 (添加 ISRG Root X1 信任的版本未知)
● Kindle > v3.4.1 (添加 ISRG Root X1 信任的版本未知)
● Blackberry >= 10.3.3 (添加 ISRG Root X1 信任的版本未知)
● 固件 >= 5.00 的 PS4 游戏机 (添加 ISRG Root X1 信任的版本未知) - 已知不兼容的平台
● Blackberry < v10.3.3
● Android < v2.3.6
● Nintendo 3DS
● Windows XP SP3 之前的系统
○ 无法处理 SHA-2 签名的证书
● Java 7 < 7u111
● Java 8 < 8u101
● Windows Live Mail(2012 版邮件客户端,而非网页端邮件服务)
○ 无法处理不包含CRL的证书
● PS3 游戏机
● PS4 游戏机(固件版本 < 5.00 )
三、使用acme.sh生成证书
-
acme.sh说明
acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书,普通用户和 root 用户都可以安装使用,安装过程不会污染已有的系统任何功能和文件, 所有的修改都限制在安装目录中(acme.sh),自动创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书。
acme.sh 实现了 acme 协议支持的所有验证协议, 一般有两种方式验证: http 和 dns 验证,dns的方式更契合我们的架构,所以采用dns方式,手动在域名上添加一条 txt 解析记录,验证域名所有权,好处是只需要 dns 的解析记录即可完成验证. 坏处是,如果不同时配置 Automatic DNS API,使用这种方式 acme.sh 将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。
注意:证书生成后只有三个月的有效期,acme.sh会自动创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书. -
安装acme.sh
#海外服务器
curl https://get.acme.sh | sh -s email=my@example.com
#国内服务器
git clone https://gitee.com/neilpang/acme.sh
#国内需要更改目录名
mv acme.sh .acme.sh
创建一个别名:
alias acme.sh=~/.acme.sh/acme.sh
- 更新acme.sh
目前由于 acme 协议和 letsencrypt CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步。
升级 acme.sh 到最新版 :
./acme.sh --upgrade
开启自动升级:
./acme.sh --upgrade --auto-upgrade
关闭自动更新:
./acme.sh --upgrade --auto-upgrade 0
- 生成证书(以GoDaddy为例)
参考来源:https://github.com/acmesh-official/acme.sh/wiki/dnsapi
先登录到使用DNS解析的账号, 生成api key和secret ,然后:
export GD_Key=""
export GD_Secret=""
设置let’s encrypt为默认ssl证书
./acme.sh --set-default-ca --server letsencrypt
生成证书:
./acme.sh --issue --dns dns_gd -d test.com -d www.test.com
若使用阿里云,将以下红框内容替换即可:
四、安装证书
默认生成的证书都放在安装目录下: .acme.sh/, 请不要直接使用此目录下的文件, 例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件。 这里面的文件都是内部使用, 而且目录结构可能会变化。
正确的使用方法是使用 --install-cert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置,例如:
Apache example:
acme.sh --install-cert -d visbodyfit.com \
--cert-file /path/to/certfile/in/apache/cert.pem \
--key-file /path/to/keyfile/in/apache/key.pem \
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
--reloadcmd "service apache2 force-reload"
Nginx example:
mkdir -p /etc/nginx/acme.sh/visbod/
#实际执行时使用命令:
./acme.sh --install-cert -d visbody.com \
--cert-file /etc/nginx/acme.sh/visbod/cert.pem \
--key-file /etc/nginx/acme.sh/visbod/key.pem \
--fullchain-file /etc/nginx/acme.sh/visbod/fullchain.pem \
--reloadcmd "service nginx force-reload"
#官网给的命令:
acme.sh --install-cert -d visbodyfit.com \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "service nginx force-reload"
注意:Nginx 的配置 ssl_certificate 使用 /etc/nginx/ssl/fullchain.cer ,而非 /etc/nginx/ssl/.cer ,否则 SSL Labs 的测试会报 Chain issues Incomplete 错误。
指定的所有参数都会被自动记录下来, 并在将来证书自动更新以后, 被再次自动调用.
acme.sh --info -d visbodyfit.com
会输出如下内容:
DOMAIN_CONF=/root/.acme.sh/visbodyfit.com/visbodyfit.com.conf
Le_Domain=visbodyfit.com
Le_Alt=no
Le_Webroot=dns_ali
Le_PreHook=
Le_PostHook=
Le_RenewHook=
Le_API=https://acme-v02.api.letsencrypt.org/directory
Le_Keylength=
Le_OrderFinalize=https://acme-v02.api.letsencrypt.org/acme/finalize/23xxxx150/781xxxx4310
Le_LinkOrder=https://acme-v02.api.letsencrypt.org/acme/order/233xxx150/781xxxx4310
Le_LinkCert=https://acme-v02.api.letsencrypt.org/acme/cert/04cbd28xxxxxx349ecaea8d07
Le_CertCreateTime=1649358725
Le_CertCreateTimeStr=Thu Apr 7 19:12:05 UTC 2022
Le_NextRenewTimeStr=Mon Jun 6 19:12:05 UTC 2022
Le_NextRenewTime=1654456325
Le_RealCertPath=
Le_RealCACertPath=
Le_RealKeyPath=/etc/acme/example.com/privkey.pem
Le_ReloadCmd=service nginx force-reload
Le_RealFullChainPath=/etc/acme/example.com/chain.pem
查看上传证书是否存在,然后点击“HTTPS配置”即可看到该证书能配置的域名:
五、更新证书
acme.sh在生成证书后会自动添加定时任务,目前证书在60天后会自动更新。
查看定时任务:
crontab -l
输出内容大致如下:
56 * * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
六、排错
参考文档:https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh
使用acme.sh过程中如果出现错误,可以添加debug log分析:
acme.sh --issue ..... --debug