{{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.6acme.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 nginxDNS-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 nginx1    mkdir -p /etc/httpd/ssl/example.com
2    chmod 700 /etc/httpd/ssl1   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 --force1   acme.sh--list1   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 --reload1    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证书需求,欢迎联系!