使用acme.sh颁发TLS证书并安装到nginx/apache实现网站https访问

使用acme.sh颁发TLS证书并安装到nginx/apache实现网站https访问

原文永久链接:https://forum.piwind.com/d/22-shi-yong-acmeshban-fa-tlszheng-shu-bing-an-zhuang-dao-nginxapacheshi-xian-wang-zhan-httpsfang-wen

Date: 2025-06-21

补充说明:acme.sh的邮件里说明了从2025-06-04开始,免费的续订邮件通知服务结束了,以后需要自己配置通知了。

本文的目的:详细解读acme.sh这个开源脚本的内容和用法,并给出一套较优的实践方案,特别适合于没有做DNS轮询、nginx反向代理高可用集群的多服务器多应用的场景。

链接:

最流行的免费CA - Let's Encrypt官网:https://letsencrypt.org/

Let's Encrypt机构推荐的用于申请证书的ACME客户端:ACME Client Implementations - Let's Encrypt

工具acme.sh官方仓库:https://github.com/acmesh-official/acme.sh

acme.sh安装选项:How to install · acmesh-official/acme.sh Wiki

参考链接:

中文说明:说明 · acmesh-official/acme.sh Wiki

cloudflare的DNS API使用方法:dnsapi · acmesh-official/acme.sh Wiki

使用 acme.sh 配置自动续签 SSL 证书 - 烧饼博客

使用 acme.sh 进行SSL证书的申请和自动更新 - 月飞博客

技术路线和路径规划:

使用acme.sh工具,从Let's Encrypt这个CA机构获取免费证书

规划脚本存放位置:/data/linux/software/acme.sh

规划acme.sh脚本的数据存放位置【权限确保是600】:/data/linux/files/acme_data

规划证书和私钥的存放位置:/data/linux/files/tls_certs

1. acme.sh安装配置和使用

acme.sh安装和配置流程:

## 下载acme.sh

cd /data/linux/files/download

git clone --depth 1 https://github.com/acmesh-official/acme.sh.git

## 安装acme.sh,邮箱改成需要通知到的邮箱

cd acme.sh

./acme.sh --install \

--home /data/linux/software/acme.sh \

--config-home /data/linux/files/acme_data \

--accountemail "my@example.com"

## 参数说明:--home 是安装软件的目录

# --config-home 是存储acme.sh的数据(包括cert/keys, configs)

# --cert-home 是保存证书的目录,默认是--config-home的位置

# --accountkey 是保存私钥文件的目录,默认是--config-home的位置

# --accountemail 是登记在Let's Encrypt中的email,会收到续订证书通知邮件,留空就默认取值CA_EMAIL的值

# --nocron 表示安装不带修改crontab

## 装完之后source一下环境变量

source ~/.bashrc

## 切换CA机构为letsencrypt

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

安装会做3个动作:

复制软件到目录,创建配置到目录

将acme.sh的环境变量写入 ~/.bashrc

## 示例执行内容:

export LE_WORKING_DIR="/data/linux/software/acme.sh"

export LE_CONFIG_HOME="/data/linux/files/acme_data"

alias acme.sh="/data/linux/software/acme.sh/acme.sh --config-home '/data/linux/files/acme_data'"

将每日任务写入cron

示例内容:

27 11 * * * "/data/linux/software/acme.sh"/acme.sh --cron --home "/data/linux/software/acme.sh" --config-home "/data/linux/files/acme_data" > /dev/null

2. acme.sh验证域名并颁发证书

acme.sh验证域名所有权并颁发证书的方式:

HTTP验证【不适用于泛域名证书 *.example.com】

webroot验证:在域名解析到对应的服务器的网站根目录(webroot)下创建临时验证文件,CA机构验证该文件的可访问性,以验证域名所有权。

适用场景:已有运行的 Web 服务器(如 Apache/Nginx),且运行命令的用户对网站根目录有写入权限。

acme.sh --issue -d example.com -w /path/to/webroot

【路径不出问题就一直能续期】

standalone模式验证:必须root用户,让acme.sh开一个80端口监听并完成验证。

适用场景:无运行中的 web服务器,80/tcp端口是空闲的。

acme.sh --issue --standalone -d example.com -d www.example.com -d cp.example.com

【得保证续期的时候80/tcp没被占用,才能完成续期】

调用web服务器插件验证:必须root用户,acme.sh调用nginx/apache加载临时配置以完成验证,不会改动原先的nginx/apache的配置文件。

acme.sh --issue --nginx -d example.com

acme.sh --issue --apache -d example.com

【可以自动续期】

DNS验证【申请泛域名证书 *.example.com必须用这个】【没有公网ip也可以用DNS验证】

使用DNS provider的API验证:在DNS provider的控制台中创建API key,把获得的信息存入环境变量,再通过acme.sh调用验证流程即可。

调用方法:How to use DNS API

## 支持通配符证书

acme.sh --issue -d example.com -d '*.example.com' --dns dns_cf

【可以自动续期】

手动添加DNS记录以验证:先用acme.sh获取随机的TXT record,再将记录添加到域名的DNS记录中,等待至少1分钟生效后,最后使用acme.sh完成验证

【不能自动续期】

使用别名域来完成DNS验证:给域名的DNS记录添加一条CNAME记录指向别名域名,再在acme.sh中验证,acme.sh会先定位到目标域名跳转到别名域名,再往别名域名中添加TXT记录完成验证。

【可以自动续期】

申请ECC证书:

acme.sh默认申请的都是RSA证书,现代化的ECC证书体积更小、更安全、性能更强,申请ECC证书就是在以上所有办法中添加参数 -k ec-256

(如果考虑兼容很旧的设备,则同时申请ECC和RSA证书,同时配置在nginx中)

为了更灵活也不影响webroot的内容:

可以在nginx.conf中添加如下内容以单独为acme-challange设置路径:

## acme-challenge

server {

listen 80;

listen [::]:80;

server_name piwind.com *.piwind.com;

location /.well-known/acme-challenge {

root /usr/share/nginx/acme-challenge;

}

# 其他非挑战请求强制跳转到HTTPS

location / {

return 301 https://$host$request_uri;

}

}

操作:webroot验证

在nginx.conf中写了指定路径的网页根目录为/usr/share/nginx/acme-challenge,申请证书:

acme.sh --issue -d us01.piwind.com --webroot /usr/share/nginx/acme-challenge -k ec-256

操作:使用DNS provider的API验证

域名是托管在cloudflare上,因此先访问cloudflare的API Tokens页面:https://dash.cloudflare.com/profile/api-tokens

创建API Token,选择模板"Edit zone DNS",Zone Resources选择需要申请证书的域名,可以限制客户端ip以达到最安全的目的,单区域提供token放在环境变量CF_Token,域名的zone ID放在环境变量CF_Zone_ID

也可以Zone Resources包括所有域名,用一个token操作所有域名的验证,多区域提供oken放在环境变量CF_Token,账号的account ID放在环境变量CF_Account_ID(进入任意域名的Overview,右侧面板上有)

## 本次用多区域的方式比较方便,在命令前添加空格以避免这条命令被history记录

export HISTCONTROL=ignorespace

export CF_Token="xxxxxx"

export CF_Account_ID="xxxxxx"

acme.sh --issue -d piwind.com -d '*.piwind.com' --dns dns_cf -k ec-256

操作成功后退出会话即可清空环境变量

3. 将证书安装到Apache/Nginx

Apache example:

acme.sh --install-cert -d example.com \

--cert-file /path/to/certfile/in/apache/cert.pem \

--key-file /path/to/keyfile/in/apache/key.pem \

--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \

--reloadcmd "service apache2 force-reload"

Nginx example:

acme.sh --install-cert -d example.com \

--key-file /path/to/keyfile/in/nginx/key.pem \

--fullchain-file /path/to/fullchain/nginx/cert.pem \

--reloadcmd "service nginx force-reload"

安装的作用是将web服务器所需的文件从数据目录选出来复制到指定路径,并将reload命令写到acme.sh的数据目录中,以便于续订证书的时候执行并在服务器中生效。

证书和私钥内容写入,会保留原先所在位置文件的权限(acme.sh生成的证书默认644,私钥600),因此方便配置权限。

操作:将证书安装到nginx

## 要先创建目录

mkdir -p /data/linux/files/tls_certs

## 安装ecc证书到nginx

acme.sh --install-cert -d us01.piwind.com --ecc \

--key-file /data/linux/files/tls_certs/us01.piwind.com.key \

--fullchain-file /data/linux/files/tls_certs/us01.piwind.com.fullchain.cer \

--reloadcmd "systemctl force-reload nginx"

# 泛域名证书只要写main_domain

acme.sh --install-cert -d piwind.com --ecc \

--key-file /data/linux/files/tls_certs/piwind.com.key \

--fullchain-file /data/linux/files/tls_certs/piwind.com.fullchain.cer \

--reloadcmd "systemctl force-reload nginx"

之后就可以在nginx的配置文件中引用证书和私钥文件了,比如创建文件 /etc/nginx/conf.d/us01.piwind.com.conf,内容如下:

server {

listen 443 ssl;

listen [::]:443 ssl;

http2 on;

server_name us01.piwind.com;

ssl_certificate /data/linux/files/tls_certs/piwind.com.fullchain.cer;

ssl_certificate_key /data/linux/files/tls_certs/piwind.com.key;

location / {

root /usr/share/nginx/html;

proxy_set_header Host $server_name;

}

}

然后重新加载nginx:

nginx -t

nginx -s reload

4. 服务器SSL在线检测

链接:

SSL Server Test (Powered by Qualys SSL Labs)

SSL状态检测

参考结果:

acme.sh常用操作

## 列出证书信息

acme.sh --list

## 移除证书并手动删除文件

acme.sh --remove -d us02.piwind.com

rm -rf /data/linux/files/acme_data/us02.piwind.com_ecc

rm -rf /data/linux/files/tls_certs/us02.piwind.com.*

方便操作:申请单域名证书

## 要先创建目录

mkdir -p /data/linux/files/tls_certs

export SINGLE_DOMAIN=us02.piwind.com

acme.sh --issue -d ${SINGLE_DOMAIN} --webroot /usr/share/nginx/acme-challenge -k ec-256

acme.sh --install-cert -d ${SINGLE_DOMAIN} --ecc \

--key-file /data/linux/files/tls_certs/${SINGLE_DOMAIN}.key \

--fullchain-file /data/linux/files/tls_certs/${SINGLE_DOMAIN}.fullchain.cer \

--reloadcmd "systemctl force-reload nginx"

将泛域名证书同步给其他服务器

参考链接:

amazon ec2 - How do I add SSH Keys to authorized_keys file? - Ask Ubuntu

在需要证书的服务器上编写同步脚本(修改配置区中的域名就够了):

此内容请至原文链接中查看。

参考链接和阅读记录

链接:

ssl是什么_ssl_tls的区别_SSL证书 | Cloudflare

数字签名和CA数字证书的核心原理和作用_哔哩哔哩_bilibili

三行命令,免费申请https加密证书,一次配置,永久生效。NAS/家庭内网服务配置TLS加密,自建网站配置SSL/TLS加密_哔哩哔哩_bilibili

来自deepseek-R1的回答:

本文声明:

此文可能会存在排版、样式不美观,图片无法显示等问题

文章内容在原文永久链接中会定期更新,此文不做同步更新

限于篇幅长度限制,此文可能会有裁剪

建议阅读原文链接

相关风暴

赢了会所嫩模,输了下海干活
s365国网公司健步走app

赢了会所嫩模,输了下海干活

🌀 07-12 🌊 阅读 8611
日本OL的最愛輕食!吃的杯湯 「Soup Stock Tokyo」
365bet中文网站

日本OL的最愛輕食!吃的杯湯 「Soup Stock Tokyo」

🌀 07-28 🌊 阅读 7476
出海成功的,为什么是抖音而不是微信?
s365国网公司健步走app

出海成功的,为什么是抖音而不是微信?

🌀 08-26 🌊 阅读 4746