
三个多月没写文章了,上半年经历了被裁员,找工作,入职,转正等一系列事情,目前总算是尘埃落定了,继续开始搞创作
通过 https 协议访问网站时,SSL 证书确保了数据传输的安全性。目前,大多数云服务提供商提供的免费证书有效期只有 90 天,想要更长时间的证书则需要付费。这意味着每隔 90 天就需要重新签发并替换证书文件。
折腾一番后,我找到了一个免费且优雅的方案,只需要在服务器上安装相关脚本,就能申请到免费的域名证书,它会定期检查证书的有效期,实现到期自动续期与更新,从而有效地获得了一个“永久”的证书。
本文就跟大家详细分享下这个方案,欢迎各位感兴趣的开发者阅读本文。
我们需要用到ACME这个程序来完成证书的申请与签发。
首先,我们需要通过SSH连接到服务器,通过以下命令来安装:
curl https://get.acme.sh | sh 安装程序会自动做以下操作:
acme.sh安装到你的 home 的.acme.sh目录下,即~/.acme.sh/alias acme.sh=~/.acme.sh/acme.sh因为 acme 已经被 ZeroSSL 收购,其默认的证书方式为 ZeroSSL ,但此证书生成时会携带邮箱,因此需要更换为letsencrypt
acme.sh --set-default-ca --server letsencrypt 泛域名证书是一种能够为同一个主域名(例如 kaisir.cn )下的所有子域名(如 www.kaisir.com 、resource.kaisir.cn 等)提供安全加密的数字证书。能够通过一个单一的证书来保护主域名及其所有子域名的数据传输,使得网站管理者无需为每个子域名分别购买和管理多个 SSL 证书。
通过 acme 申请的证书,可以绑定满足该通配符型规则的任意三级子域名,例如:
www.kaisir.cn test.kaisir.cn aaa.kaisir.cn bb.kaisir.cn ... 如果你对数字证书比较感兴趣,可以移步我的另一篇文章:数字证书的理解
acme 提供的泛域名证书只能通过 dns 的形式来做验证,因此我们需要进入域名解析控制台(你可以在此处找到你的域名解析提供商)创建 API ID 和 API Key 。
我这里以阿里云为例,登录成功后,去到阿里云的RAM 访问控制面板来创建用户。
由于每个平台的环境变量名称是不一样的,因此你需要去acme-dnsapi 网站里找到你平台的变量名。我这里以阿里云为例,将 key 和 secret 换成上一步创建的即可。
export Ali_Key="key" export Ali_Secret="secret" 做完上述操作后,我们的准备工作就做完了,可以使用acme.sh脚本来创建证书了。
acme.sh --issue --dns dns_ali -d kaisir.cn -d '*.kaisir.cn' --dnssleep 300 --debug --dns 用于指定 dns 校验平台,我这里是阿里云-d是你的网站主域名,第二个是泛域名 --dnssleep用于等待操作,因为把 txt 添加到后台,解析不一定能做到立刻生效,所以需要延时一下,此处我设置了 300 秒的延时,执行命令的过程会有个等待倒计时。 --debug开启调试模式,创建过程中会打印详细的日志出来,方便定位错误。创建成功后,你将看到如下所示的内容:
最后,我们只需要找到创建好的证书,将其在服务器上的路径填写到 nginx 中即可。脚本会在证书快到期时,自动续期并创建相关文件。
本章节将以我的服务器为例,跟大家分享下如何去做相关的配置。
如果你的服务是直接运行在宿主机上的,请跳过这一步。
我的服务是运行在 docker 容器里的,因此需要先把服务器的证书路径映射进容器中,此处我以docker-compose为例,在volumes节点下添加映射即可。
nginx-server: image: nginx:1.18.0 container_name: local_nginx volumes: - /root/.acme.sh/kaisir.cn_ecc:/usr/share/acme 注意:如果你只使用了 docker ,则需要在运行
docker run指令时,通过添加-v参数来添加路径映射,例如docker run -v /root/.acme.sh/kaisir.cn_ecc:/usr/share/acme。
/root/.acme.sh/kaisir.cn_ecc是宿主机上的路径/usr/share/acme是容器内部的路径如果你对 docker 不是很了解,可以移步我的另一篇文章:使用 docker 来编排 Web 应用
随后,我们就可以打开nginx的配置文件,指定ssl 证书的位置即可。
/usr/share/acme/就是我们上一步所映射出来的路径fullchain.cer就是我们申请到的泛域名证书server { # 配置 ssl 证书 ssl_certificate /usr/share/acme/fullchain.cer; ssl_certificate_key /usr/share/acme/kaisir.cn.key; } 最后,我们重启 nginx ,通过浏览器访问网站就能看到证书信息了
至此,文章就分享完毕了。
我是神奇的程序员,一位前端开发工程师。
如果你对我感兴趣,请移步我的个人网站,进一步了解。
忽略图片的防盗链问题了。大家移步我的网站看吧:使用ACME申请SSL证书
1 Nosub 2024 年 7 月 17 日 via iPhone |
2 love4taylor PRO 你不考虑下掘金图片防盗链的问题么 |
3 MagicCoder OP @Love4Taylor v 站能看到就行了,问题不大。 |
4 love4taylor PRO |
5 MagicCoder OP @Love4Taylor 奇怪了,我这里又能看到。 |
6 MagicCoder OP @Love4Taylor 卧槽,我开浏览器的无痕模式就看不到了 |
7 ysc3839 2024 年 7 月 18 日 acme.sh 曾经出现过远程代码执行漏洞,因为是脚本,不知道现在是否还有相关漏洞,或许很难保证安全。 除了安全问题,acme.sh 解析数据似乎是直接使用 grep 等正则表达式匹配,健壮性不足。 再者还有隐性依赖问题,可能系统里没装某些工具,直接执行脚本并不能看出缺少哪些工具,等到执行到那部分时可能崩溃或出现奇怪的问题。 Certbot 主要问题是依赖过多东西,官网的 CentOS 7 安装教程干脆让装个 snap ,过于复杂了。 目前我选择 Lego https://github.com/go-acme/lego 单文件,无外部依赖,配合自己写的 systemd service 和 timer 自动运行。 |
8 DefoliationM 2024 年 7 月 18 日 via Android 看到开头就知道是公众号,直接翻到结尾。 |
9 MagicCoder OP @DefoliationM 害 也不是,就是分享文章,没其他意思。 |
10 MagicCoder OP @ysc3839 soga ,学到了 |
11 MagicCoder OP @Nosub 学到了,这个不错 |
12 yhxx 2024 年 7 月 18 日 v 站分享这个引不到什么流啊 这里的人应该没几个不会的 看标题说永久我还以为有什么新姿势 |
13 MagicCoder OP @yhxx 不引流,就是单纯的分享下 |
14 evill 2024 年 7 月 18 日 “最后,我们重启 nginx ”,acme 可以执行命令重启 --reloadcmd "service nginx force-reload" |
15 goodryb 2024 年 7 月 18 日 不如你贴个原文的连接 |
16 MagicCoder OP |
17 veapon 2024 年 7 月 18 日 勾选第一页的所有权限 ---- 这个这么高的权限吗?我去原文看了下,第一页其中包括 AdministratorAccess ,AliyunECSFullAccess ,AliyunRAMFullAccess 这些 |
18 ounxnpz 2024 年 7 月 18 日 标题党 |
19 MagicCoder OP @veapon 他需要的是增、删权限,我图省事,就把第一页的全勾选了 |
20 MagicCoder OP @bluicezhen 啊?不算吧,文中讲的东西确实无痛更新了 |
21 madao199 2024 年 7 月 18 日 你不是去年去了一家上市公司吗 被裁了? |
22 maladaxia 2024 年 7 月 18 日 这不是正常操作吗? let's encrypt 官网就有, 还以为你发现新大陆了, 标题党 |
23 mohumohu 2024 年 7 月 18 日 还不如用 caddy ,0 配置 |
24 MagicCoder OP @madao199 对的,被裁员了,事业部被一锅端了 |
25 ciki 2024 年 7 月 18 日 看到标题想到不会是自动续期吧?没想到还真是,以为有什么黑科技。太水了 |
26 busier 2024 年 7 月 18 日 acme 走 DNS API 更新的话,根本不涉及操作系统文件,就不应该给 root 权限操作 |
27 imydou 2024 年 7 月 18 日 续签就说续签,根证书都没永久 |
28 root71370 2024 年 7 月 18 日 不如体验下 1panel ,证书从来没管过~ |
29 yunyuyuan 2024 年 7 月 18 日 文章确实比较基础,但 OP 分享的精神还是值得支持的 |
30 MagicCoder OP 文章中阿里云的 ram 控制台授权那里给的权限太多了,其实只用给一个就可以了,v 站没法更新了,原文已更正错误了。原文地址: https://www.kaisir.cn/post/178 |
31 NoDataNoBB 2024 年 7 月 18 日 我需要一台永久的服务器 |
32 xiangyuecn 2024 年 7 月 18 日 如果需要手动获取证书 pem 文件,可以使用我的网页版 ACME 客户端: 向 Let's Encrypt 、ZeroSSL 、Google 等支持 ACME 协议的证书颁发机构,免费申请获得用于 HTTPS 的 SSL/TLS 域名证书( RSA 、ECC/ECDSA ),支持多域名和通配符泛域名;只需在现代浏览器上操作即可获得 PEM 格式纯文本的域名证书,不依赖操作系统环境,无需下载和安装软件,纯手动操作,只专注于申请获得证书这一件事。 仅一个静态 HTML 文件,不依赖其他任何文件: https://xiangyuecn.github.io/ACME-HTML-Web-Browser-Client/ACME-HTML-Web-Browser-Client.html |
33 xiamuguizhi 2024 年 7 月 18 日 @imydou 是的。 需要楼主开放一个服务器给我们自动续签,实现永久 哈哈。 |
34 Actrace 2024 年 7 月 18 日 @xiamuguizhi 微林有这项服务,免费的,非常好用。 |
35 ilylx2008 2024 年 7 月 18 日 还得调用 cdn 接口自动更新 cdn 证书,很多地方 |
36 charley008 2024 年 7 月 18 日 这不是基本操作吗?对这 acme 文档来一遍也会啊。。 |
37 alanyuan 2024 年 7 月 18 日 via iPhone 虚假标题 |
38 Rennen 2024 年 7 月 18 日 评论区看满离 |
39 pota 2024 年 7 月 18 日 我现在就是自己写脚本自动化 acme.定时读取多个云的域名 https 有效期,通过 dns 对接多个云自动申请部署。很好用 |
40 lxcopenwrt 2024 年 7 月 18 日 acme.sh 还不支持 ACME Renewal Information (ARI),这玩意给证书续期不受 letsencrypt 的速率限制,看 GitHub 有人提了 PR 但最后没合并进主线 |
41 defunct9 2024 年 7 月 18 日 嘟噜嘟噜一大堆,用 lego 不比这个轻便么 |
42 victimsss 2024 年 7 月 18 日 |
43 sanshao124 2024 年 9 月 25 日 @Actrace @BaymaxK @DefoliationM @Love4Taylor @NoDataNoBB @Nosub @Rennen @alanyuan @busier @charley008 各位大佬,请教一个问题,我的系统是 mac ,安装了 docker ,如果我只是想通过 docker 实现自动获取某个域名的证书该怎么弄呢?最好带自动续期的 我只需要本地获取了证书文件就行,比如域名.key ,域名.pem ,这种文件,不需要再做其他操作,网上搜的要么很复杂,要么就在 mac 上无法实现 我对 docker 了解的不多,只会照着已有的命令改改参数 |
44 Actrace 2024 年 9 月 26 日 @sanshao124 目前我用的是微林家的免费证书服务,只需要设置一个 CNAME 完成域名的验证,就可以自动生成证书,不需要跑 docker 什么的。 |