SSL证书

需求和目的
首先来一张图片。
我们大家肯定或多或少都访问过这样的网站,网站没有加密,导致出现安全提醒。如果是你搭建的网站肯定也是不希望你的用户看到这样的界面的,否则可能就会和当时的你一样选择直接关掉网站。
除此之外,我们自用的一些服务也会用到证书,比如说你的Nas的公网访问等等。
那么这篇文章就是用来解决这个问题的。
目前推荐的免费证书颁发机构只有三个:Let’s Encrypt,ZeroSSL,Google Trust Servirce。三家机构颁发证书的区别见文章末尾附录。本文演示的证书颁发机构为Let’s Encrypt。
acme.sh 申请证书
acme.sh 是一个运行在linux终端的证书申请脚本用来申请免费的SSL证书。
安装
- 如果你的服务器位于中国大陆地区,那么需要先在终端执行下面这行命令,用来修改host。
zsh echo -e "185.199.111.154 github.githubassets.com\n140.82.113.22 central.github.com\n185.199.108.133 desktop.githubusercontent.com\n185.199.109.133 camo.githubusercontent.com\n185.199.109.133 github.map.fastly.net\n151.101.193.194 github.global.ssl.fastly.net\n140.82.116.3 gist.github.com\n185.199.110.153 github.io\n140.82.116.4 github.com\n140.82.116.5 api.github.com\n185.199.110.133 raw.githubusercontent.com\n185.199.110.133 user-images.githubusercontent.com\n185.199.110.133 favicons.githubusercontent.com\n185.199.109.133 avatars5.githubusercontent.com\n185.199.110.133 avatars4.githubusercontent.com\n185.199.108.133 avatars3.githubusercontent.com\n185.199.108.133 avatars2.githubusercontent.com\n185.199.109.133 avatars1.githubusercontent.com\n185.199.111.133 avatars0.githubusercontent.com\n185.199.111.133 avatars.githubusercontent.com\n140.82.116.10 codeload.github.com\n52.217.229.201 github-cloud.s3.amazonaws.com\n52.216.185.51 github-com\n.s3.amazonaws.com\n52.217.225.81 github-production-release-asset-2e65be.s3.amazonaws.com\n52.217.120.41 github-production-user-asset-6210df.s3.amazonaws.com\n3.5.28.232 github-production-repository-file-5c1aeb.s3.amazonaws.com\n185.199.111.153 githubstatus.com\n185.199.109.133 media.githubusercontent.com\n185.199.108.133 objects.githubusercontent.com\n185.199.109.133 raw.github.com\n138.91.182.224 copilot-proxy.githubusercontent.com" > /etc/hosts - 安装必要软件
zsh sudo apt install -y cron curl socat openssl git - 通过git下载acme.sh包
zsh git clone https://github.com/acmesh-official/acme.sh.git - 进入安装目录
zsh cd ./acme.sh - 执行安装
zsh ./acme.sh --install -m myemail@example.com #这里天蝎你自己的邮箱 - 重启终端以启用命令
zsh source ~/.bashrc``` - 启用脚本自动更新
zsh acme.sh --upgrade --auto-upgrade
配置
证书颁发机构配置
acme.sh 刚下载好之后默认的证书颁发机构为ZeroSSL,如果希望使用此机构那么不用做修改
切换 acme.sh 请求的证书颁发机构的命令如下:
acme.sh --set-default-ca --server letsencrypt #将默认的证书颁发机构改成Let's Encryptacme.sh --set-default-ca --server zerossl #将默认的证书颁发机构改成ZeroSSLacme.sh --set-default-ca --server google #将默认的证书颁发机构改成Google Public CA为acme.sh证书颁发机构账号认证配置
- Let’s Encrypt无需账号配置,不需要邮箱或者密钥认证
- ZeroSSL账号配置(推荐我的这种方式,尽量不要用邮箱); 需要先到ZeroSSL官网中注册账户,并在Developer中创建EAB Credentials for ACME Clients
- GTS的证书申请密钥是一次性的,所以要随用随取,不过一旦证书申请成功,自动续期时仍然可用。
- ZeroSSL
acme.sh --register-account --server zerossl \--eab-kid xxxxxxxxxxxx \--eab-hmac-key xxxxxxxxx-
Google Trust Servirce
- 需要先拥有一个Google Cloud Platform(GCP)账号,然后进入控制台左上角新建/选择一个项目
- 在顶部搜索栏搜索并进入Public Certificate Authority API 之后点击启用
- 再之后点击右上角shell图标进入Cloud Shell使用以下命令获取 EAB 密钥 ID 和 HMAC
- 谷歌EAB密钥使用一次或者七天后自动失效,所以每次申请证书的时候都要来获取一次密钥,但续费不用
GCP Shell-进入项目设置 gcloud config set project projectIDGCP Shell-申请密钥 gcloud publicca external-account-keys create- 在acme.sh中设置GCP 账号和项目密钥eab-kid是[申请到的 keyId],eab-hmac-key是[申请到的 b64MacKey]
zsh acme.sh --register-account -m myemail@example.com --server google \--eab-kid xxxxxxx \--eab-hmac-key xxxxxxx
申请证书
申请证书为了方便全都使用dns令牌的方式,以在cloudflare做dns为例。
可以把dns令牌写入 ~/.acme.sh/account.conf,但我推荐以下方式。Cloudflare的Token申请方式不在本文讲解范围内可自行查询
其他常见dns供应商配置,参见文章末尾附录
- 在终端中使用全局变量的方式传入你的CFtoken
zsh export CF_Token="your cf token" - 申请证书
通配符证书
单个二级域名证书
zsh acme.sh --issue --dns dns_cf \-d *.example.com \-d example.com \--keylength ec-256zsh acme.sh --issue --dns dns_cf \-d exp.example.com \--keylength ec-256
默认情况下证书存放在 ~/.acme.sh/example.com/目录下
安装/部署证书
在本地环境中,我一般是使用Nginx作为Web服务器和反向代理的工具,所以此处就以Nginx为例。
使用以下命令将证书与密钥安装到指定目录,并在证书安装后重启Nginx服务
末尾的 --reloadcmd 这个参数就是在安装证书之后要执行的命令。
acme.sh --install-cert -d *.example.com --ecc \--key-file /etc/nginx/certified/example.com/example.key \--fullchain-file /etc/nginx/certified/example.com/fullchain.cer \--reloadcmd "systemctl reload nginx"acme.sh拥有Webhook能力,可以将证书部署到远程服务器,Webhost,CDN平台等能力,具体的远程部署方式和本地部署方式大相径庭,我这里就以七牛云为例。
假设你是要将泛域名证书部署到七牛云,并且你已经在七牛云创建了密钥。那么可以直接执行一下命令。
- 传入密钥与加速域名的变量
zsh export QINIU_AK="your AK"export QINIU_SK="your SK"export QINIU_CDN_DOMAIN="cdn1.example.com cdn2.example.com" - 部署证书
zsh acme.sh --deploy -d *.example.com --deploy-hook qiniu
更多平台的部署方式可以参考官方文档
Web工具申请证书
使用Web工具进行证书管理不是必须的,但是我认为有一定的必要性,所以在文章中简单做一下讲解。
必要性
- 方便操作,WebUI中的操作其实相比较与命令行终端肯定更加方便。
- 方便控制额度,免费证书颁发机构在GTS中有每个项目1000张证书的限制,而另外两个机构有速率限制,Web管理工具可以很方便的做到本地一张证书部署多个平台,而这个功能在命令行终端的操作比较复杂。
- 安全性,这也是最重要的一点。现在互联网上有很多扫SSL证书的脚本,这会给攻击者提供便利,直接扫描你的SSL证书申请的IP就能锁定你的源站。而Web管理工具完全可以搭建在自己家里的内网,然后部署到VPS,可以在一定程改上改善被攻击的情况。
安装部署Certimate
Certimate不是唯一拥有证书申请和部署的工具,但是它是专注于证书申请、部署和管理的工具。
Certimate最便利的使用方式就是通过Docker安装,我并不推荐二进制安装方式。Docker的应用与配置不在本文的介绍范围内。 我这里依然采用命令行终端的方式作为示范。
-
在你自己配置Docker的目录创建用于存放Certimate的文件夹。并拉取Certimate的镜像。
zsh mkdir -p /etc/dockerApp/Certimatezsh docker pull certimate/certimate:latest -
在Certimate中创建并编辑
docker-compose.yml文件nvim docker-compose.yml写入以下docker配置文件
/etc/dockerApp/Certimate/docker-compose.yml docker run -d \--name certimate \--restart unless-stopped \-p 8090:8090 \-v /etc/localtime:/etc/localtime:ro \-v /etc/timezone:/etc/timezone:ro \-v $(pwd)/data:/app/pb_data \certimate/certimate:latest
容器的默认访问端口是8090,创建成功之后在浏览器中输入 http://127.0.0.1:8090 来访问Certimate的Web管理界面。
简单配置与使用
访问web地址如果你看到下面的节目那就说明你成功了。
填入出事的管理员账号和密码
- 账号 : admin@certimate.fun
- 密码 : 1234567890
登陆进来之后首先到系统设置->账号
处修改默认的账号和密码。

接下来到授权凭据处点击右上角的新建授权,添加你的DNS提供商

在证书颁发机构的授权中如果你依然想要使用Let’s Encrypt为你颁发证书,那么此处不同添加证书授权凭据,其他的办法机构按情况添加授权。
添加完授权凭据之后到工作流中新建工作流,选择,标准业务流程。
然后你就会看到下面的界面

在开始节点选择定时触发,这里会让你写CRON表达式来设定工作流之后每一次出发的时间节点。你可以按照自己的需求写,不会的话可以找AI写表达式
忽略尝试执行节点
在申请证书节点,选择域名证书;在这里你可以配置多项参数。域名这里我推荐直接写泛域名。大多数参数你按照自己的需求和实际情况填写就行,这里我只说几个需要注意或者我推荐的配置项。
- 质询方式:DNS-01
- 密钥算法:EC256(仅推荐,你要按照你的需求选)
- 阻止 CSR 包含主题通用名称:打开
- 阻止 CNAME 跟随:打开
- 阻止 ARI 续期:打开
在部署节点选择你要部署的目标平台。由于不同的目标平台的配置不统一,不再一一列举。不同目标平台的授权凭据与域名选择不在本文的介绍范围内。
至此,Certimate的工作流建立完成。建立完成后,点击右上角的发布更改即可保存,同时不要忘记启用工作流。我这里建议手动运行一次检查是否有配置错误的情况

如果你需要在失败的时候收到通知可以选择通知节点进行配置。
附录
证书颁发机构
| CA名称 | ZeroSSL(acme.sh默认) | Let’s Encrypt(使用最广泛,最推荐) | Google Public CA(谷歌提供的免费CA) |
|---|---|---|---|
| 特点 | 90天有效期 ✅ 通配符支持 ✅ 无速率限制 🚫 通过邮箱或EAB强制验证 ✅自动续期不占用额度 ✅单证书验证域名数:100 | 90天有效期 ✅ 通配符支持 🚫速率:50张/域名/ ✅ 无需账户/邮箱验证 ✅自动续期不占用额度 ✅单证书验证域名数:100 | 90天有效期 ✅ 通配符支持 🚫速率:100张/小时 🚫 通过GCP项目EAB强制认证 ✅自动续期不占用额度 ✅单证书验证域名数:100 ✅ 集成谷歌云服务 🚫项目账户申请证书 🚫限制:1000张/项目 |
常见DNS供应商配置
| 机构 | dns参数 | token令牌命令(必须在申请证书之前操作) |
|---|---|---|
| Cloudflare | dns_cf | CF_Token=“your cf token” |
| 腾讯云 | dns_dp | export DP_Id=“123456” export DP_Key=“abcdef” |
| 阿里云 | dns_ali | export Ali_Key=“123456” export Ali_Secret=“abcdef” |
| 华为云 | dns_huawei | export HUAWEICLOUD_Username=" export HUAWEICLOUD_Password=" export HUAWEICLOUD_DomainName=" |
| GoDaddy | dns_gd | export GD_Key=" |
| DigitalOcean | dns_dgon | export DO_API_KEY=” |
| netcup | dns_netcup | export NC_Apikey=" export NC_Apipw=" |
| Vultr DNS | dns_vultr | export VULTR_API_KEY=" |
| AWS Route53 | dns_aws | export AWS_ACCESS_KEY_ID=" export AWS_SECRET_ACCESS_KEY=" |
| Google Cloud DNS | dns_gcloud | export CLOUDSDK_ACTIVE_CONFIG_NAME=default |
| Namecheap | dns_namecheap | export NAMECHEAP_USERNAME=”…“ export NAMECHEAP_API_KEY=”…“ export NAMECHEAP_SOURCEIP=”…” # 必须添加 |
| Hurricane Electric | dns_he | export HE_Username=" export HE_Password=" |
| Porkbun | dns_porkbun | export PORKBUN_API_KEY=”…“ export PORKBUN_SECRET_API_KEY=”…” |
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!
