Youtube视频
相关链接
安装
基础依赖
# socat 是sandalone需要的依赖,如果你不使用该模式,可以不安装
# debian/ubuntu
apt -y install openssl cron socat curl
# centos
yum -y install openssl crontabs socat curl
# alpine
apk --no-cache add -f openssl curl socat
# kali
apt-get -qqy install openssl cron socat curl
安装
# email用于注册Let's Encrypted,请填有效邮箱,避免出现注册失败
curl https://get.acme.sh | sh -s email=hi@gmail.com
# 刷新bashrc配置文件,使别名立即生效
source ~/.bashrc
常用命令
# 升级并设置自动升级
acme.sh --upgrade --auto-upgrade
# 查看版本
acme.sh -v
# 列出所有证书
acme.sh --list
# 查看配置
acme.sh --info
# 查看域名配置,多域名证书填主域名
acme.sh --info -d xxx.com
# 续期
# 运行定时器,续期所有证书,ecc证书后面最好需要添加--ecc
acme.sh --cron
# 续期指定证书,--force 强制刷新,ecc证书后面最好需要添加--ecc
acme.sh --renew -d xxx.com
# 续期所有证书
acme.sh --renew-all
# 移除证书,只是移除自动更新和管理,证书文件不会删除
acme.sh --remove -d example.com --ecc
# 设置默认CA,目前脚本默认为zerossl
acme.sh --set-default-ca --server letsencrypt
安装证书(先颁发证书)
# --key-file为安装密钥文件的路径;
# --fullchain-file为安装证书文件的路径;
# --ca-file为安装CA证书文件的路径
# --reloadcmd 为安装成功后执行的命令,一般执行让证书生效的命令,或者分发证书的脚本等
acme.sh --install-cert -d example.com \
--key-file /etc/nginx/ssl/example.com.key \
--fullchain-file /etc/nginx/ssl/example.com.crt \
--ca-file /etc/nginx/ssl/example.com.ca.crt \
--reloadcmd "systemctl restart nginx"
CA对比
当前acme.sh默认的CA是ZeroSSL(因为被ZeroSSL收购了)
CA | ShortName | 最长天数 | 是否支持ECC | 域名数量 | 是否支持通配符 | IPv4 | IPv6 | 终止日期 | 是否支持国际化域名 |
---|---|---|---|---|---|---|---|---|---|
Let's Encrypt | letsencrypt | 90 | Yes | 100 | Yes | No | No | No | Yes |
ZeroSSL | zerossl | 90 | Yes | 100 | Yes | No | No | Yes | Yes |
90 | Yes | 100 | Yes | No | No | Yes | No | ||
Buypass | buypass | 180 | Yes | 5 | Paid | No | No | No | Yes |
SSL.com | sslcom | 90 | Yes | 2 | Paid | No | No | No | Yes |
CA配置
ZeroSSL CA
方法1
acme.sh --register-account --server zerossl -m myemail@gmail.com
方法2
- 注册/登录ZeroSSL账号:https://app.zerossl.com/signup
- 打开开发者页面,生成EAB凭证:https://app.zerossl.com/developer
也可以通过API获取EAB凭证
apt install jq
curl -s -X POST "https://api.zerossl.com/acme/eab-credentials?access_key=你的API_Key" | jq
- 注册账号
acme.sh --register-account --server zerossl \
--eab-kid xxxxxxxxxxxx \
--eab-hmac-key xxxxxxxxx
Let's Encrpyted CA
# 实测这里指定邮箱地址没有用,会直接用安装时候使用的邮箱
# 所以如果你安装的时候指定了一个不合法的邮箱地址,那有可能会注册失败
acme.sh --register-account --server letsencrypt -m myemail@gmail.com
Google Public CA
- 打开Google Cloud Console:https://console.cloud.google.com/projectcreate
- 创建项目,也可以使用已有项目
- 启动API:https://console.cloud.google.com/apis/library/publicca.googleapis.com
- 打开控制台(Cloud Shell)在屏幕右上方
获取Account Key(注意,生成的凭证是一次性使用的)
# 设置当前控制台的session为指定的项目,设置成功控制台命令行会高亮显示当前项目的ID gcloud config set project <项目ID> # 生成凭证,keyId位 eab-id,b64MacKey为eab-hmac-key gcloud publicca external-account-keys create
注册,回到服务器终端
acme.sh --register-account --server google -m myEmail@gmail.com \ --eab-kid 'xxxxxxxxxxxxxxx' \ --eab-hmac-key 'xxxxxxxxxxxxx'
颁发证书
Webroot模式
- 添加域名解析
- 安装启用Nginx(其他web服务器也可以,只是配置不一样)
配置Nginx
# 进入到nginx的静态文件目录,创建验证证书的目录 cd /usr/share/nginx/html mkdir -p .well-known/acme-challenge
# 配置nginx server { listen 80; server_name 自己的域名; location /.well-known/acme-challenge/ { alias /usr/share/nginx/html/.well-known/acme-challenge/; } }
颁发
# --issue为颁发证书命令 # -d 指定需要签证的域名 # -w 表示使用webroot模式,并指定webroot的所在目录(acme.sh需要有改目录的权限) acme.sh --issue -d 自己的域名 -w /usr/share/nginx/html
Nginx模式
- 添加域名解析
- 安装启用Nginx
配置Nginx
server { listen 80; server_name 你的域名; root /usr/share/nginx/html; }
颁发
# --nginx表示使用nginx模式,默认会从/etc/nginx/nginx.conf寻找配置文件 acme.sh --issue -d 你的域名 --nginx # 如果nginx的配置文件不在默认路径,可以在后面指定 acme.sh --issue -d 你的域名 --nginx /other/nginx/nginx.conf
Standalone 独立模式 & 独立模式TLS
- 添加域名解析
- 安装
socat
依赖(请查看安装) 颁发
# --standalone表示使用独立模式 # --keylength 表示使用的证书长度,默认是ecc证书,这里2048表示使用rsa证书2048长度;其他颁发模式同样可以指定使用的证书长度 # 默认使用80端口颁发证书,但是如果端口被占用可以指定--httpport,如果使用80端口,请删除该参数 acme.sh --issue -d 你的域名 --standalone --keylength 2048 --httpport 808 ## --apln表示使用独立模式TLS # 默认使用443端口颁发证书,但是如果端口被占用可以指定--tlsport,如果使用443端口,请删除该参数 acme.sh --issue -d 你的域名 --alpn --tlsport 8443
Stateless 无状态模式
- 添加域名解析
获取账号指纹(ACCOUNT_THUMBPRINT)
# 获取默认CA的账号指纹,如果需要获取其他CA请指定--server acme.sh --register-account
配置Nginx(其他服务器也可以)
server { listen 80; server_name 你的域名; location ~ ^/\.well-known/acme-challenge/([-_a-zA-Z0-9]+)$ { default_type text/plain; return 200 "$1.你的账号指纹"; } }
颁发
# --stateless表示使用无状态模式 acme.sh --issue -d 你的域名 --stateless
DNS手动模式
太麻烦,不推荐
预颁发,获取TXT记录
# --dns表示使用dns模式 # --yes-I-know-dns-manual-mode-enough-go-ahead-please 手动模式需要该参数 acme.sh --issue -d 你的域名 --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
- 将TXT记录添加到你的域名解析
使用续签命令颁发
# --renew 为续期命令 acme.sh --renew -d 你的域名 --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
DNS API模式
- 确认域名提供商是否支持API模式,以及配置方式
https://github.com/acmesh-official/acme.sh/wiki/dnsap
https://github.com/acmesh-official/acme.sh/wiki/dnsapi2 下面是Cloudflare的配置,导入相关的参数
# 请参考视频获取Token等相关参数 export CF_Token="xxxxxx" export CF_Account_ID="xxxxxx" export CF_Zone_ID="xxxxxx"
颁发
# --dns 表示使用模式,指定需要使用的dns提供商,dns_cf为cloudflare # 以下是签发主域名的方式,指定两个-d参数即可,多域证书同理 acme.sh --issue --dns dns_cf -d example.com -d www.example.com
DNS Alias模式
别名模式请参照视频,适合不支持DNS API模式的域名提供商,或者需要保护域名的安全。可以使用别名模式。
泛域名证书
# 指定两个-d参数,第二个为泛域名
# --dns dns_cf使用dns api模式,域名提供商为Cloudflare
# --server为指定CA机构,也可以使用默认的
acme.sh --issue -d example.com -d *.example.com --dns dns_cf --server google
多域名(SAN)证书
# 可以指定多个-d参数,则为多域名证书,第一个-d参数指定的域名为主域名。可以指定不同的域名
acme.sh --issue -d a.example.com -d b.example.com -d c.other.com --dns dns_cf
混合模式
同为SAN证书,只不过是每个域名使用不同的验证模式
# 第一个域名使用Nginx模式验证;第二个域名使用dns api模式验证
acme.sh --issue -d a.example.com --nginx -d b.example.com --dns dns_cf