{{item}}
{{item.title}}
{{items.productName}}
{{items.price}}/年
{{item.title}}
部警SSL证书可实现网站HTTPS加密保护及身份的可信认证,防止传输数据的泄露或算改,提高网站可信度和品牌形象,利于SEO排名,为企业带来更多访问量,这也是网络安全法及PCI合规性的必备要求
前往SSL证书acme.sh作为一款开源的ACME协议客户端工具,以轻量、自动化、跨平台的特性被广泛应用 —— 它支持通过Let's Encrypt等免费证书机构自动申请、部署和续期SSL证书,无需复杂的手动操作。本文将详细讲解acme.sh的安装配置、证书申请、多场景部署(如 Nginx、Apache、CDN)以及自动续期的全流程,帮助用户快速实现SSL证书的自动化管理。
acme.sh的设计目标是 “零依赖、全自动”,相比其他ACME客户端(如 Certbot),其核心优势体现在:
acme.sh的安装过程简洁,通过一行命令即可完成,同时会自动配置基础环境。
使用curl或wget下载并执行安装脚本:
1 # 方法1:使用curl
2 curl https://get.acme.sh| sh
3
4 # 方法2:使用wget
5 wget -O - https://get.acme.sh| sh
安装脚本会完成以下操作:
执行以下命令查看版本,确认安装成功:
1 acme.sh--version
2 # 输出示例:acme.shv3.0.6
acme.sh默认使用Let's Encrypt的生产环境,但也支持其他ACME协议证书机构,如 ZeroSSL、Buypass等。切换方法:
1 # 切换到ZeroSSL(需先注册,邮箱用于接收证书通知)
2 acme.sh--register-account -m your@email.com --server zerossl
3
4 # 切换回Let's Encrypt
5 acme.sh--server letsencrypt
注意:生产环境建议使用Let's Encrypt或ZeroSSL,测试环境可使用Let's Encrypt的staging服务器(避免证书申请频率限制):
1 acme.sh--server letsencrypt --staging
申请证书的核心是通过ACME协议向证书机构证明 “域名所有权”,acme.sh支持三种主流验证方式,需根据服务器环境选择。
HTTP-01 验证通过在服务器的/.well-known/acme-challenge/路径下放置验证文件,让证书机构的爬虫访问该文件以确认域名控制权。
部分情况下,acme.sh会临时启动内置Web服务器占用 80 端口,需先停止当前Web服务:
1 # 以Nginx为例
2 systemctl stop nginx
使用--issue命令,指定域名和Web根目录(Web 服务的根路径):
1 # 单域名证书
2 acme.sh--issue -d example.com -w /var/www/html
3
4 # 多域名证书(主域名+子域名)
5 acme.sh--issue -d example.com -d www.example.com -w /var/www/html
其中:
执行命令后,acme.sh会自动在/var/www/html/.well-known/acme-challenge/下生成验证文件,并临时启动Web服务(若未指定-w)。证书机构验证通过后,证书会生成在~/.acme.sh/example.com/目录下。
1 systemctl start nginx
DNS-01 验证通过在域名的DNS解析记录中添加TXT记录,让证书机构查询该记录以确认所有权,支持通配符证书(如*.example.com)。
1 # 申请通配符证书
2 acme.sh--issue -d example.com -d *.example.com --dns
3
4 # 执行后,命令行会提示需要添加的TXT记录,例如:
5 # Please add the following TXT record:
6 # Domain: _acme-challenge.example.com
7 # TXT value: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
登录域名的DNS管理界面(如阿里云 DNS、Cloudflare),添加提示中的TXT记录,主机记录为_acme-challenge,记录值为提示的字符串。
DNS 记录生效可能需要 1-10 分钟(取决于TTL设置),可通过nslookup验证:
1 nslookup -type=TXT _acme-challenge.example.com
确认记录生效后,重新执行证书申请命令(无需再次添加记录,acme.sh会自动检测):
1 acme.sh--issue -d example.com -d *.example.com --dns
若域名托管在支持API的DNS服务商(如 Cloudflare、阿里云),可通过配置API密钥实现TXT记录自动添加,无需手动操作:
1 # 以Cloudflare为例,先设置API密钥
2 export CF_Key="your_cloudflare_global_api_key"
3 export CF_Email="your_cloudflare_email"
4
5 # 自动申请通配符证书
6 acme.sh--issue -d example.com -d *.example.com --dns dns_cf
支持的DNS服务商及配置方法可参考acme.sh官方文档。
TLS-ALPN-01 验证通过在TLS握手过程中传递验证信息,需服务器开放 443 端口,适用于无法使用 80 端口的场景。
1 # 停止占用443端口的服务
2 systemctl stop nginx
3
4 # 申请证书(使用--alpn参数)
5 acme.sh--issue -d example.com --alpn
6
7 # 重启服务
8 systemctl start nginx
注意:该方式依赖TLS ALPN协议,部分老旧服务器可能不支持,建议优先使用 HTTP-01 或 DNS-01。
申请SSL证书后,证书文件存储在~/.acme.sh/域名/目录下,但直接使用该目录的文件存在风险(acme.sh可能自动更新目录结构)。正确的做法是将证书部署到Web服务的配置目录,并配置自动更新。
Nginx 通常从/etc/nginx/ssl/目录读取证书,创建该目录并设置权限:
1 mkdir -p /etc/nginx/ssl/example.com
2 chmod 700 /etc/nginx/ssl
使用--install-cert命令将证书复制到目标目录,并配置自动续期后重启 Nginx:
1 acme.sh--install-cert -d example.com \
2 --key-file /etc/nginx/ssl/example.com/key.pem \
3 --fullchain-file /etc/nginx/ssl/example.com/fullchain.pem \
4 --reloadcmd "systemctl reload nginx"
编辑Nginx配置文件(如/etc/nginx/sites-available/example.com):
1 server {
2 listen 443 ssl;
3 server_name example.com www.example.com;
4
5 ssl_certificate /etc/nginx/ssl/example.com/fullchain.pem;
6 ssl_certificate_key /etc/nginx/ssl/example.com/key.pem;
7
8 # 推荐的SSL配置(增强安全性)
9 ssl_protocols TLSv1.2 TLSv1.3;
10 ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
11 ssl_prefer_server_ciphers on;
12 ssl_session_cache shared:SSL:10m;
13
14 # 网站根目录
15 root/var/www/html;
16 index index.html;
17 }
18
19 # HTTP自动跳转HTTPS
20 server {
21 listen 80;
22 server_name example.com www.example.com;
23 return 301 https://$host$request_uri;
24 }
1 nginx -t # 验证配置是否正确
2 systemctl reload nginx
1 mkdir -p /etc/httpd/ssl/example.com
2 chmod 700 /etc/httpd/ssl
1 acme.sh--install-cert -d example.com \
2 --key-file /etc/httpd/ssl/example.com/key.pem \
3 --fullchain-file /etc/httpd/ssl/example.com/fullchain.pem \
4 --reloadcmd "systemctl reload httpd"
编辑Apache配置文件(如/etc/httpd/conf.d/ssl.conf或虚拟主机配置):
1 <VirtualHost *:443>
2 ServerName example.com
3 ServerAlias www.example.com
4
5 SSLEngine on
6 SSLCertificateFile /etc/httpd/ssl/example.com/fullchain.pem
7 SSLCertificateKeyFile /etc/httpd/ssl/example.com/key.pem
8
9 # 推荐的SSL配置
10 SSLProtocol TLSv1.2 TLSv1.3
11 SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
12 SSLHonorCipherOrder on
13
14 DocumentRoot /var/www/html
15 <Directory /var/www/html>
16 AllowOverride All
17 Require all granted
18 </Directory>
19 </VirtualHost>
20
21 # HTTP跳转HTTPS
22 <VirtualHost *:80>
23 ServerName example.com
24 ServerAlias www.example.com
25 Redirect permanent / https://example.com/
26 </VirtualHost>
1 systemctl reload httpd
对于需要将证书部署到CDN(如 Cloudflare)、负载均衡器(如 HAProxy)或云服务(如 AWS ALB)的场景,可手动导出证书文件,再按平台要求上传:
1 # 查看证书存储目录
2 acme.sh--list
3 # 输出示例:Main_Domain: example.com, KeyLength: 2048, Domains: example.com, www.example.com, KeyFile: ~/.acme.sh/example.com/example.com.key, ...
通过scp将fullchain.pem(证书链)和key.pem(私钥)复制到本地,再上传至目标平台的证书管理界面。
若平台支持API,可编写脚本实现证书更新后自动同步,例如通过Cloudflare API更新边缘证书:
1 # 在--reloadcmd中添加同步命令(示例)
2 acme.sh--install-cert -d example.com \
3 --key-file /path/to/key.pem \
4 --fullchain-file /path/to/fullchain.pem \
5 --reloadcmd "systemctl reload nginx && /path/to/cloudflare-cert-sync.sh"
Let's Encrypt等免费证书的有效期为 90 天,acme.sh默认启用自动续期,但需确保续期机制正常运行。
acme.sh安装时会自动添加 crontab 任务,执行以下命令查看:
1 crontab -l
2 # 输出示例:0 0 * * * "/root/.acme.sh"/acme.sh--cron --home "/root/.acme.sh" > /dev/null
该任务每天凌晨 0 点运行,检查所有证书是否需要续期(默认到期前 30 天自动续期)。
1 # 测试续期(不实际执行,仅模拟)
2 acme.sh--cron --dry-run
3
4 # 强制续期(用于测试,生产环境谨慎使用)
5 acme.sh--renew -d example.com --force
1 acme.sh--list
1 acme.sh--remove -d example.com
证书默认存储在~/.acme.sh/目录,可直接打包备份:
1 tar -zcvf acme_backup.tar.gz ~/.acme.sh/
将备份文件解压到原目录,重新执行部署命令即可:
1 tar -zxvf acme_backup.tar.gz -C ~/
2 acme.sh--install-cert -d example.com [其他参数]
原因:证书机构的验证服务器无法访问目标服务器的 80 端口(HTTP-01 验证)或 443 端口(TLS-ALPN-01 验证),可能由以下因素导致:
解决方案:
1 # 查看80端口是否开放
2 firewall-cmd --query-port=80/tcp # 适用于firewalld
3 iptables -L | grep 80 # 适用于iptables
4
5 # 若未开放,添加规则
6 firewall-cmd --add-port=80/tcp --permanent
7 firewall-cmd --reload
1 nslookup example.com # 确认解析的IP与服务器公网IP一致
原因:证书机构未查询到预期的TXT记录,可能原因包括:
解决方案:
主机记录:_acme-challenge(单域名)或_acme-challenge.www(子域名www.example.com);
记录值:严格匹配acme.sh输出的字符串(区分大小写,无空格);
1 # 清除本地 DNS 缓存(部分系统支持)
2 systemctl restart systemd-resolved
多域名验证时,按提示分别添加对应域名的TXT记录,避免混淆。
原因:自动续期依赖crontab任务和证书权限,常见失败原因:
解决方案:
1 systemctl status crond # 确保服务处于running状态
1 acme.sh--cron --home ~/.acme.sh/ # 手动执行续期并查看输出
2 cat ~/.acme.sh/acme.sh.log # 查看详细日志
验证--reloadcmd有效性:直接执行该命令,确认服务能正常重启(如systemctl reload nginx);
原因:acme.sh执行用户(如非root用户)无权限操作目标文件或目录,常见于:
解决方案:
1 chown -R $USER:$USER /etc/nginx/ssl # 替换$USER为实际用户名
acme.sh工具通过自动化的SSL证书申请、部署与续期流程,极大简化了SSL证书的管理工作,尤其适合中小型网站、个人博客等场景。其核心优势在于零依赖、高灵活性和强大的自动化能力,支持多种验证方式和部署场景。
Dogssl.cn拥有20年网络安全服务经验,提供构涵盖国际CA机构Sectigo、Digicert、GeoTrust、GlobalSign,以及国内CA机构CFCA、沃通、vTrus、上海CA等数十个SSL证书品牌。全程技术支持及免费部署服务,如您有SSL证书需求,欢迎联系!