实战指南:使用acme.sh生成非ECC证书的完整流程与避坑要点
·

为什么还需要非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为例):
- 先设置API令牌环境变量
export CF_Token="your_cloudflare_api_token"
export CF_Account_ID="your_account_id"
- 使用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
多节点同步方案
- 使用rsync同步证书目录
- 通过Ansible批量部署
- 结合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参数强制更新
最终建议
对于需要最大化兼容性的场景,推荐:
- 主证书使用RSA 2048
- 备用证书使用ECC 256
- 在Nginx中配置双证书(TLS 1.3自动选择最优证书)
通过合理配置,acme.sh完全可以满足传统系统的证书管理需求,同时保持自动化管理的便利性。
更多推荐

所有评论(0)