原文永久链接: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反向代理高可用集群的多服务器多应用的场景。

链接:

参考链接:

技术路线和路径规划:

使用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个动作:

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

  2. 将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'"
  3. 将每日任务写入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"

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

参考链接:

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

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

参考链接和阅读记录

链接:

来自deepseek-R1的回答:

本文声明:

  • 此文可能会存在排版、样式不美观,图片无法显示等问题
  • 文章内容在原文永久链接中会定期更新,此文不做同步更新
  • 限于篇幅长度限制,此文可能会有裁剪

建议阅读原文链接

使用acme.sh颁发TLS证书并安装到nginx/apache实现网站https访问的更多相关文章

  1. ubuntu安装nginx和设置网站https访问

    安装nginx 在控制台 输入 sudo apt-get install nginx 等待安装成功之后.可以打开浏览器.输入你的域名或者ip地址会出现"Welcome to nginx!&q ...

  2. phpstudy如何安装景安ssl证书 window下apache服务器网站https访问

    1. 下载景安免费证书 https://www.zzidc.com/help/helpDetail?id=555 2.文件解压上传至服务器,位置自己决定 3. 调整apache配置 景安原文链接:ht ...

  3. Windows下Nginx配置SSL实现Https访问(包含证书生成)

    Vincent.李   Windows下Nginx配置SSL实现Https访问(包含证书生成) Windows下Nginx配置SSL实现Https访问(包含证书生成) 首先要说明为什么要实现https ...

  4. 阿里云申请免费SSL证书,并配置到Tomcat,实现https访问

    第一步:阿里云免费https证书安装  https://jingyan.baidu.com/article/fdffd1f8619481f3e98ca196.html 第二步:阿里云申请免费SSL证书 ...

  5. acme.sh建立SAN证书 和泛域名证书

    文件来源 https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert domain=$domain time=`date +%Y%m%d% ...

  6. docker安装nginx并配置通过https访问

    1. 下载最新的nginx的docker image docker pull nginx:latest 创建挂载路径 2.准备nginx需要的文件 nginx的配置文件 首先是nginx.conf文件 ...

  7. centos中安装配置nginx完成之后主机无法访问

    原因 VMware中安装centos7,安装配置完成nginx后,主机无法访问.虚拟机没有放行Nginx默认端口80. 解决办法 首先:开启 web 端口 firewall-cmd --permane ...

  8. startssl 申请证书,并在Nginx, apache, Tomcat上使用

    tomcat: http://blog.csdn.net/buyaore_wo/article/details/5771470 apache: http://blog.mowd.tw/index.ph ...

  9. 解决问题:centos虚拟机安装好nginx,本机无法访问

    阵子在虚拟机上装好了centos5.3,并配好了nginx+php+mysql,但是本机就是无法访问.一直就没去折腾了.具体情况如下1.本机能ping通虚拟机2.虚拟机也能ping通本机3.虚拟机能访 ...

  10. Linux下使用acme.sh 配置https 免费证书

    acme.sh 简单来说acme.sh 实现了 acme 协议, 可以从 let‘s encrypt 生成免费的证书.acme.sh 有以下特点:一个纯粹用Shell(Unix shell)语言编写的 ...

随机推荐

  1. oracle中查看锁表,ORACLE中查看当前系统中锁表情况

    1.ORACLE中查看当前系统中锁表情况 select * from v$locked_object 2.可以通过查询v$locked_object拿到sid和objectid,然后用sid和v$se ...

  2. Oracle DB 关于CONNECT、RESOURCE 和DBA 角色权限

    授予角色的语法: grant <object/system privilege> to <role name>; 一般情况下,在新建数据库用户后,都会习惯性的给用户授权CONN ...

  3. Windows 提权-密码搜寻

    本文通过 Google 翻译 Password Hunting – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释 ...

  4. HashMap 在高并发场景下可能出现的性能问题以及如何规避这些问题

    JDK1.8 之前 HashMap 底层是 数组和链表, 之后在之前基础上加上红黑树. 相比于之前的版本, JDK1.8 之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转 ...

  5. 基于.NetCore开发 StarBlog 番外篇 (1) StarBlog Publisher,跨平台一键发布,DeepSeek加持的文章创作神器

    前言 我一直在优化发布文章的工作流 之前的 StarBlog 已经支持文章打包上传(将 Markdown 和图片文件一并打包为 ZIP 格式上传),但还是有不少步骤,重复的次数多了,还是感觉麻烦. 为 ...

  6. Bitcoin部署到openEuler RISC-V

      Bitcoin项目源码是用C++写的,我对C++以及它的编译工具又比较熟悉,这次我尝试了在openEuler RISC-V 24.09上面部署Bitcoin.网上编译Bitcoin源码的很多都是以 ...

  7. leetcode每日一题:最少翻转操作数

    题目 2612. 最少翻转操作数 给你一个整数 n 和一个在范围 [0, n - 1] 以内的整数 p ,它们表示一个长度为 n 且下标从 0 开始的数组 arr ,数组中除了下标为 p 处是 1 以 ...

  8. 🎀EXCEL-时间函数

    简介 在Excel中,时间函数用于处理和操作日期和时间数据; 以下是Excel中常用的时间函数及其常见应用场景的总结. 函数 时间函数基础 TIME 语法:TIME(hour, minute, sec ...

  9. 通过 Python 在PDF中添加、或删除超链接

    PDF文件现已成为文档存储和分发的首选格式.然而,PDF文件的静态特性有时会限制其交互性.超链接是提高PDF文件互动性和用户体验的关键元素.Python作为一种强大的编程语言,拥有多种库和工具来处理P ...

  10. web自动化:webdriver常用api

    一.获取操作 1.get('url'):访问指定的url webdriver.get(String url); 2.Getcurrenturl():获取当前页面url webDriver.getCur ...