证书管理示意图

为什么还需要非ECC证书?

虽然ECC(Elliptic Curve Cryptography)证书在性能和安全性上更优,但在实际项目中我们仍然会遇到必须使用RSA证书的场景:

  • 老旧系统兼容性(如Windows Server 2008、Android 4.4以下)
  • 特定中间件要求(某些金融行业CA强制要求RSA)
  • 硬件设备支持限制(工业控制设备、物联网终端等)

acme.sh默认使用ECC证书,但通过参数调整可以轻松生成RSA证书。下面是从申请到部署的完整流程。

核心操作步骤

1. 基础证书申请

关键参数说明:

acme.sh --issue --dns dns_cf \
  -d example.com \
  --keylength 2048 \       # RSA密钥长度(主流选择2048/4096)
  --days 90 \              # 有效期(Let's Encrypt最大90天)
  --server letsencrypt \   # 指定CA机构
  --force \                # 覆盖已有证书
  --log \                  # 生成日志文件
  --ocsp                   # 启用OCSP装订

2. DNS验证优化

根据你的DNS服务商选择验证方式(以Cloudflare为例):

  1. 先设置API令牌环境变量
export CF_Token="your_cloudflare_api_token"
export CF_Account_ID="your_account_id"
  1. 使用DNS验证模式申请(避免80/443端口占用问题)
acme.sh --issue --dns dns_cf -d *.example.com

3. 生产环境脚本示例

带错误处理的完整脚本:

#!/bin/bash
# 证书生成脚本(保存为 gen_cert.sh)

domain="example.com"
cert_home="/etc/nginx/certs"
log_file="/var/log/acme_${domain}.log"

echo "[$(date)] 开始证书申请" >> $log_file

acme.sh --issue --dns dns_cf \
  -d $domain \
  --keylength 2048 \
  --days 90 \
  --server letsencrypt \
  --force 2>&1 | tee -a $log_file

if [ ${PIPESTATUS[0]} -ne 0 ]; then
  echo "证书申请失败!" | tee -a $log_file
  exit 1
fi

# 证书安装到Nginx
acme.sh --install-cert -d $domain \
  --key-file $cert_home/${domain}.key \
  --fullchain-file $cert_home/fullchain.cer \
  --reloadcmd "systemctl reload nginx"

echo "[$(date)] 证书部署完成" >> $log_file

安全注意事项

私钥存储最佳实践

  • 设置严格的文件权限:chmod 600 /path/to/private.key
  • 使用专用证书存储目录
  • 考虑使用HSM(Hardware Security Module)或KMS(Key Management Service)

避免ACME速率限制

  • 测试时使用Let's Encrypt的staging环境:--server https://acme-staging-v02.api.letsencrypt.org/directory
  • 相同域名每天最多申请5次证书
  • 每周最多失败5次验证

生产环境部署方案

自动续期配置

编辑crontab(crontab -e):

0 0 * * * /usr/local/bin/acme.sh --cron --home /root/.acme.sh >> /var/log/acme_cron.log

多节点同步方案

  1. 使用rsync同步证书目录
  2. 通过Ansible批量部署
  3. 结合Consul Template自动更新配置

证书自动续期流程

常见问题排查

  • 错误:Too many certificates already issued
    等1周后再申请,或添加新子域名

  • 错误:Invalid response from https://acme-v02.api.letsencrypt.org
    检查DNS解析是否生效,API令牌是否有效

  • 错误:Cert not yet due for renewal
    使用--force参数强制更新

最终建议

对于需要最大化兼容性的场景,推荐:

  1. 主证书使用RSA 2048
  2. 备用证书使用ECC 256
  3. 在Nginx中配置双证书(TLS 1.3自动选择最优证书)

通过合理配置,acme.sh完全可以满足传统系统的证书管理需求,同时保持自动化管理的便利性。

Logo

音视频技术社区,一个全球开发者共同探讨、分享、学习音视频技术的平台,加入我们,与全球开发者一起创造更加优秀的音视频产品!

更多推荐