使用 ACME 申请免费“永久”的 SSL 证书

200 天前
 BaymaxK

三个多月没写文章了,上半年经历了被裁员,找工作,入职,转正等一系列事情,目前总算是尘埃落定了,继续开始搞创作🤗

前言

通过 https 协议访问网站时,SSL 证书确保了数据传输的安全性。目前,大多数云服务提供商提供的免费证书有效期只有 90 天,想要更长时间的证书则需要付费。这意味着每隔 90 天就需要重新签发并替换证书文件。

折腾一番后,我找到了一个免费且优雅的方案,只需要在服务器上安装相关脚本,就能申请到免费的域名证书,它会定期检查证书的有效期,实现到期自动续期与更新,从而有效地获得了一个“永久”的证书。

本文就跟大家详细分享下这个方案,欢迎各位感兴趣的开发者阅读本文。

环境搭建

我们需要用到ACME这个程序来完成证书的申请与签发。

程序安装

首先,我们需要通过SSH连接到服务器,通过以下命令来安装:

curl  https://get.acme.sh | sh

安装程序会自动做以下操作:

更改默认证书

因为 acme 已经被 ZeroSSL 收购,其默认的证书方式为 ZeroSSL ,但此证书生成时会携带邮箱,因此需要更换为letsencrypt

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

申请泛域名证书

泛域名证书是一种能够为同一个主域名(例如 kaisir.cn )下的所有子域名(如 www.kaisir.comresource.kaisir.cn 等)提供安全加密的数字证书。能够通过一个单一的证书来保护主域名及其所有子域名的数据传输,使得网站管理者无需为每个子域名分别购买和管理多个 SSL 证书。

通过 acme 申请的证书,可以绑定满足该通配符型规则的任意三级子域名,例如:

www.kaisir.cn
test.kaisir.cn
aaa.kaisir.cn
bb.kaisir.cn
...

如果你对数字证书比较感兴趣,可以移步我的另一篇文章:数字证书的理解

获取 DNS API 参数

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

创建成功后,你将看到如下所示的内容:

安装证书

最后,我们只需要找到创建好的证书,将其在服务器上的路径填写到 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

随后,我们就可以打开nginx的配置文件,指定ssl 证书的位置即可。

server {
	# 配置 ssl 证书
	ssl_certificate   /usr/share/acme/fullchain.cer;
	ssl_certificate_key  /usr/share/acme/kaisir.cn.key;
}

实现效果

最后,我们重启 nginx ,通过浏览器访问网站就能看到证书信息了🤗

写在最后

至此,文章就分享完毕了。

我是神奇的程序员,一位前端开发工程师。

如果你对我感兴趣,请移步我的个人网站,进一步了解。

5015 次点击
所在节点    程序员
44 条回复
madao199
199 天前
你不是去年去了一家上市公司吗 被裁了?
maladaxia
199 天前
这不是正常操作吗?
let's encrypt 官网就有, 还以为你发现新大陆了, 标题党👎🏿
mohumohu
199 天前
还不如用 caddy ,0 配置
BaymaxK
199 天前
@madao199 对的,被裁员了,事业部被一锅端了
ciki
199 天前
看到标题想到不会是自动续期吧?没想到还真是,以为有什么黑科技。太水了
busier
199 天前
acme 走 DNS API 更新的话,根本不涉及操作系统文件,就不应该给 root 权限操作
imydou
199 天前
续签就说续签,根证书都没永久
root71370
199 天前
不如体验下 1panel ,证书从来没管过~
yunyuyuan
199 天前
文章确实比较基础,但 OP 分享的精神还是值得支持的
BaymaxK
199 天前
文章中阿里云的 ram 控制台授权那里给的权限太多了,其实只用给一个就可以了,v 站没法更新了,原文已更正错误了。原文地址: https://www.kaisir.cn/post/178
NoDataNoBB
199 天前
我需要一台永久的服务器
xiangyuecn
199 天前
如果需要手动获取证书 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
xiamuguizhi
199 天前
@imydou 是的。 需要楼主开放一个服务器给我们自动续签,实现永久 哈哈。
Actrace
199 天前
@xiamuguizhi 微林有这项服务,免费的,非常好用。
ilylx2008
199 天前
还得调用 cdn 接口自动更新 cdn 证书,很多地方
charley008
199 天前
这不是基本操作吗?对这 acme 文档来一遍也会啊。。
alanyuan
199 天前
虚假标题
Rennen
199 天前
评论区看满离
pota
199 天前
我现在就是自己写脚本自动化 acme.定时读取多个云的域名 https 有效期,通过 dns 对接多个云自动申请部署。很好用
lxcopenwrt
199 天前
acme.sh 还不支持 ACME Renewal Information (ARI),这玩意给证书续期不受 letsencrypt 的速率限制,看 GitHub 有人提了 PR 但最后没合并进主线

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/1058116

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX