分类 默认分类 下的文章

使用 acme.sh 申请 Let's Encrypt ECC 证书

本文以 demo.example.com 为例,使用 acme.sh 申请 Let's Encrypt 的 ECC P-256 证书,并安装给nginx使用。

1. 安装 acme.sh

curl -sL https://get.acme.sh | sh -s email=example@gmail.com
source ~/.bashrc
这里的邮箱不需要校验真实性,符合邮箱规则即可

检查:

acme.sh --version

开启自动升级:

acme.sh --upgrade --auto-upgrade

设置 Let's Encrypt 为默认 CA:

acme.sh --set-default-ca --server letsencrypt

2. 申请 ECC 证书

2.2 使用http验证

申请前确保:

  • demo.example.com 已解析到当前服务器
  • 公网 TCP 80 端口可访问
  • 80 端口未被 Nginx、Apache 等服务占用

检查:

dig +short demo.example.com
ss -lntp | grep ':80 '

申请 ECC P-256 证书:

acme.sh --issue \
  -d demo.example.com \
  --keylength ec-256 \
  --standalone

--standalone 会临时监听 80 端口完成 HTTP-01 验证。

2.2使用dns验证

如果域名托管在阿里云,需要申请阿里云对应权限的aksk,通过dns的方式进行验证

export Ali_Key='xxx'
export Ali_Secret='xxx'

acme.sh --issue \
--dns dns_ali \
-d demo.example.com \
--keylength ec-256

3. 安装证书

mkdir -p /etc/nginx/ssl

安装:

acme.sh --install-cert \
  -d demo.example.com \
  --ecc \
  --key-file /etc/nginx/ssl/demo.example.com.key \
  --fullchain-file /etc/nginx/ssl/demo.example.com.pem \
  --reloadcmd "systemctl restart nginx"

最终生成:

/etc/nginx/ssl/demo.example.com.key
/etc/nginx/ssl/demo.example.com.pem

不建议让业务程序直接读取 ~/.acme.sh/ 目录中的证书,应统一通过 --install-cert 安装到业务目录。

4. 验证证书

查看本地证书:

openssl x509 \
  -in /etc/nginx/ssl/demo.example.com.pem \
  -noout \
  -subject \
  -issuer \
  -dates

查看线上实际使用的证书:

openssl s_client \
  -connect demo.example.com:443 \
  -servername demo.example.com \
  </dev/null 2>/dev/null |
openssl x509 -noout -subject -issuer -dates

5. 自动续期

安装 acme.sh 时会自动创建定时任务:

crontab -l

acme.sh 会定期检查证书,到期前自动续期。

因为设置了:

--reloadcmd "systemctl restart nginx"

证书续期成功后会自动重启 nginx,使新证书生效。

需要注意:使用 --standalone 时,后续自动续期仍然需要使用 80 端口。如果以后安装了 Nginx 并长期占用 80,建议改用 webroot 或 Nginx 验证方式。