使用acme.sh颁发TLS证书并安装到nginx/apache实现网站https访问
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在线检测
链接:
参考结果:


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"
将泛域名证书同步给其他服务器
参考链接:
在需要证书的服务器上编写同步脚本(修改配置区中的域名就够了):
此内容请至原文链接中查看。
参考链接和阅读记录
链接:
- ssl是什么_ssl_tls的区别_SSL证书 | Cloudflare
- 数字签名和CA数字证书的核心原理和作用_哔哩哔哩_bilibili
- 三行命令,免费申请https加密证书,一次配置,永久生效。NAS/家庭内网服务配置TLS加密,自建网站配置SSL/TLS加密_哔哩哔哩_bilibili
来自deepseek-R1的回答:









本文声明:
- 此文可能会存在排版、样式不美观,图片无法显示等问题
- 文章内容在原文永久链接中会定期更新,此文不做同步更新
- 限于篇幅长度限制,此文可能会有裁剪
建议阅读原文链接
使用acme.sh颁发TLS证书并安装到nginx/apache实现网站https访问的更多相关文章
- ubuntu安装nginx和设置网站https访问
安装nginx 在控制台 输入 sudo apt-get install nginx 等待安装成功之后.可以打开浏览器.输入你的域名或者ip地址会出现"Welcome to nginx!&q ...
- phpstudy如何安装景安ssl证书 window下apache服务器网站https访问
1. 下载景安免费证书 https://www.zzidc.com/help/helpDetail?id=555 2.文件解压上传至服务器,位置自己决定 3. 调整apache配置 景安原文链接:ht ...
- Windows下Nginx配置SSL实现Https访问(包含证书生成)
Vincent.李 Windows下Nginx配置SSL实现Https访问(包含证书生成) Windows下Nginx配置SSL实现Https访问(包含证书生成) 首先要说明为什么要实现https ...
- 阿里云申请免费SSL证书,并配置到Tomcat,实现https访问
第一步:阿里云免费https证书安装 https://jingyan.baidu.com/article/fdffd1f8619481f3e98ca196.html 第二步:阿里云申请免费SSL证书 ...
- acme.sh建立SAN证书 和泛域名证书
文件来源 https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert domain=$domain time=`date +%Y%m%d% ...
- docker安装nginx并配置通过https访问
1. 下载最新的nginx的docker image docker pull nginx:latest 创建挂载路径 2.准备nginx需要的文件 nginx的配置文件 首先是nginx.conf文件 ...
- centos中安装配置nginx完成之后主机无法访问
原因 VMware中安装centos7,安装配置完成nginx后,主机无法访问.虚拟机没有放行Nginx默认端口80. 解决办法 首先:开启 web 端口 firewall-cmd --permane ...
- startssl 申请证书,并在Nginx, apache, Tomcat上使用
tomcat: http://blog.csdn.net/buyaore_wo/article/details/5771470 apache: http://blog.mowd.tw/index.ph ...
- 解决问题:centos虚拟机安装好nginx,本机无法访问
阵子在虚拟机上装好了centos5.3,并配好了nginx+php+mysql,但是本机就是无法访问.一直就没去折腾了.具体情况如下1.本机能ping通虚拟机2.虚拟机也能ping通本机3.虚拟机能访 ...
- Linux下使用acme.sh 配置https 免费证书
acme.sh 简单来说acme.sh 实现了 acme 协议, 可以从 let‘s encrypt 生成免费的证书.acme.sh 有以下特点:一个纯粹用Shell(Unix shell)语言编写的 ...
随机推荐
- oracle中查看锁表,ORACLE中查看当前系统中锁表情况
1.ORACLE中查看当前系统中锁表情况 select * from v$locked_object 2.可以通过查询v$locked_object拿到sid和objectid,然后用sid和v$se ...
- Oracle DB 关于CONNECT、RESOURCE 和DBA 角色权限
授予角色的语法: grant <object/system privilege> to <role name>; 一般情况下,在新建数据库用户后,都会习惯性的给用户授权CONN ...
- Windows 提权-密码搜寻
本文通过 Google 翻译 Password Hunting – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释 ...
- HashMap 在高并发场景下可能出现的性能问题以及如何规避这些问题
JDK1.8 之前 HashMap 底层是 数组和链表, 之后在之前基础上加上红黑树. 相比于之前的版本, JDK1.8 之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转 ...
- 基于.NetCore开发 StarBlog 番外篇 (1) StarBlog Publisher,跨平台一键发布,DeepSeek加持的文章创作神器
前言 我一直在优化发布文章的工作流 之前的 StarBlog 已经支持文章打包上传(将 Markdown 和图片文件一并打包为 ZIP 格式上传),但还是有不少步骤,重复的次数多了,还是感觉麻烦. 为 ...
- Bitcoin部署到openEuler RISC-V
Bitcoin项目源码是用C++写的,我对C++以及它的编译工具又比较熟悉,这次我尝试了在openEuler RISC-V 24.09上面部署Bitcoin.网上编译Bitcoin源码的很多都是以 ...
- leetcode每日一题:最少翻转操作数
题目 2612. 最少翻转操作数 给你一个整数 n 和一个在范围 [0, n - 1] 以内的整数 p ,它们表示一个长度为 n 且下标从 0 开始的数组 arr ,数组中除了下标为 p 处是 1 以 ...
- 🎀EXCEL-时间函数
简介 在Excel中,时间函数用于处理和操作日期和时间数据; 以下是Excel中常用的时间函数及其常见应用场景的总结. 函数 时间函数基础 TIME 语法:TIME(hour, minute, sec ...
- 通过 Python 在PDF中添加、或删除超链接
PDF文件现已成为文档存储和分发的首选格式.然而,PDF文件的静态特性有时会限制其交互性.超链接是提高PDF文件互动性和用户体验的关键元素.Python作为一种强大的编程语言,拥有多种库和工具来处理P ...
- web自动化:webdriver常用api
一.获取操作 1.get('url'):访问指定的url webdriver.get(String url); 2.Getcurrenturl():获取当前页面url webDriver.getCur ...