如何能「白嫖」SSL证书?

看到「白嫖」二字,我啪的一下就点进来了

起因是今天下午看到了 krau 发的一篇博客

于是乎,我也要发,而且要比他写得更全面,《内卷的名义》

众所周知,HTTPS 流量现在已经是主流了,我们应「紧跟时代潮流」

数据来源:Google透明度报告

基于此,在搭建网站的时候,我们应优先考虑搭建 HTTPS 网站

但 HTTPS 所需要的 SSL 证书,在以前并不是免费的。但好在,有 Let’s Encrypt、TrustAsia 这样的公司或组织愿意免费给我们签发 SSL 证书。

目前申请这类免费证书的方式有两种,一种是通过网页申请,例如 FreeSSL.cn 之类的;另一种是通过脚本申请,例如 ACME.sh 之类的。

通过网页申请

通过云服务商来申请

通过网页申请的话,如果你是在国内的云服务商买的域名,一般在 SSL 证书管理上都会有一个「免费证书」的功能,通过这个功能可以免去很多繁杂的工作,一键获得 SSL 证书。

腾讯云:我的证书 - SSL 证书 - 控制台 (tencent.com)

签发机构为 TrustAsia 亚洲诚信,有效期一年,限制 20 个证书。

阿里云:数字证书管理服务管理控制台 - SSL 证书 (aliyun.com)

需要手动购买「DV单域名证书【免费试用】」包后才可创建申请,签发机构为 DigiCert,有效期一年,限制 20 个证书。

青云:SSL 证书服务 亚太2区-A AP2A 青云QingCloud 控制台

签发机构为 TrustAsia 亚洲诚信 或者 Let’s Encrypt,TA 有效期一年,LE 有效期三个月,LE 可申请泛域名证书,尚不了解限制情况(因为没申请过)。

UCloud 优刻得:UCloud - 中立 安全 可信赖

签发机构为 TrustAsia 亚洲诚信,有效期一年,同样不清楚限制情况。

七牛云:七牛云 - 证书管理 (qiniu.com)

签发机构同样为 TrustAsia 亚洲诚信,有效期一年。至于是不是免费,不好说,因为标注的是 限免

百度云:SSL证书_服务器证书_https证书 证书部署 BaiduTrust DigiCert GEOTrust-百度智能云

签发机构同样为 TrustAsia 亚洲诚信,有效期一年,限制 20 个证书。

通过一些网站来申请

FreeSSL:FreeSSL首页 - FreeSSL.cn一个提供免费HTTPS证书申请的网站

FreeSSL 可以说是我建站梦开始的地方,我在最初建站的时候就是用的 FreeSSL 申请的证书。

签发机构为 TrustAsia 亚洲诚信 或 Let’s Encrypt,TA 有效期为一年或 ∞,LE 有效期三个月。

免费SSL:免费SSL证书 - 免费申请SSL证书,HTTPS证书永久免费申请 (mianfeissl.com)

签发机构为 Comodo、RapidSSL、Let’s Encrypt,有效期就如图所示了。需要注册账号并验证手机号,并且在申请证书时的验证方式也很有限,见仁见智了。

SSL for Free:SSL For Free - Free SSL Certificates in Minutes

签发机构为 ZeroSSL,有效期三个月,(似乎)限制三个证书。

SSL.com:SSL.com offers Free SSL Certificate to encrypt your site immediately | SSL.com

通过脚本申请

ACME.sh

说到脚本申请证书,就不得不提 ACME.sh 这位重量级人物 这个赫赫有名的脚本。通过 ACME 协议,你能够很方便的从各大签发机构获得 SSL 证书。

关于 ACME 协议,可以参考以下文章:

  1. 详解 ACME V2 (RFC 8555) 协议,你是如何从Let’s Encrypt 申请到证书的 - 知乎 (zhihu.com)

  2. 什么是ACME协议? -SSL.com

该脚本的项目地址:https://github.com/acmesh-official/acme.sh

(虽然国内有许多镜像,但是依旧推荐从 GitHub 获得,因为不知道国内的镜像安全性如何)

安装&配置

ACME.sh 无法直接在 Windows 下运行,需要通过 Cygwin 来运行。如果不熟悉 Cygwin 的用法,建议优先考虑用 Linux 安装。

完整的安装方式可以参考 ACME.sh 的项目 Wiki:How to install · acmesh-official/acme.sh Wiki (github.com)

以 cURL 方式安装

1
curl https://get.acme.sh | sh -s email=my@example.com

以 Wget 方式安装

1
wget -O -  https://get.acme.sh | sh -s email=my@example.com

如果执行以上命令时提示 cURL 不存在或者 Wget 不存在,请先安装 cURL/Wget

RHEL 系的 Linux(包管理器为 yum)

1
yum install -y curl wget

Debian 系的 Linux(包管理器为 apt)

1
apt install -y curl wget

安装后,如果想要通过 HTTP 方式来验证域名归属的,可以跳过下面的步骤;如果想要通过 DNSAPI 来验证域名归属的,可以参考以下步骤

这里以 Cloudflare 为例,其他的服务商可以参考 dnsapi · acmesh-official/acme.sh Wiki (github.com) 来配置

打开 Cloudflare 的 Dashboard,并登录。

然后打开 API 配置面板,可以直接点击这个链接打开: https://dash.cloudflare.com/profile/api-tokens

创建一个 API Token,使用 Edit zone DNS 模板

建议把 Token Name 改一下,例如 ACME 之类的,以免 Token 多的时候维护麻烦。

Zone Resources 选择 Include,如果域名比较多,可以选择 All zones;如果同时管理多个账户,而只想给其中一个账户下的域名申请证书,可以选择 All zones from an account,并在后面选择上那个「独特的」的账号;如果只想给一个域名申请证书,可以选择 Specific zone,并在后面选择上那个「万一挑一」的域名

其他的选项建议自己探索发现了~

设置完,点一下下面的 Continue to summary,确认无误点 Create Token

将生成的 Token 复制下来

输入以下命令

1
2
export CF_Token="上一步得到的 Token"
export CF_Email="Cloudflare 的账号邮箱"

然后就可以进行下一步,申请证书了。

申请证书

ACME.sh 支持自动验证或手动验证,自动验证就是通过 DNSAPI 或开启本地 HTTP 服务器来自动验证(需要提前将域名解析为 ACME 所安装服务器的 IP);手动验证就是先给签发机构提交订单,然后手动去添加 DNS 解析或在 HTTP 服务器上添加验证文件。

这里以 DNSAPI 这种自动验证方式为例,其他的方式请参考 说明 · acmesh-official/acme.sh Wiki (github.com)

直接敲命令,以 Cloudflare 为例,请把 test.leao9203.xyz 替换为需要申请证书的域名

1
acme.sh --issue --dns dns_cf -d test.leao9203.xyz

脚本会自动向 CA (签发机构)提交订单,添加 DNS 的解析记录,验证 DNS 解析记录,并下载证书,下载之后,脚本会显示证书位置,此时就可以使用证书了。

后记

这篇文章可以说是开了一个大坑,写完上面内容的时候大概就已经 1800+ 字了

插图也是从 22 号一直到 24 号才整完

以后再也不给自己开坑了

参考内容

  1. 使用ACME脚本申请并配置SSL证书 | 柯罗krau的博客 | krau’s blog

  2. 网络上的 HTTPS 加密 – Google 透明度报告

  3. 33种免费获取SSL证书的方式 - 知乎 (zhihu.com)

  4. acmesh-official/acme.sh: A pure Unix shell script implementing ACME client protocol (github.com)