共计 5921 个字符,预计需要花费 15 分钟才能阅读完成。
公司之前花钱购买的 ssl 证书快到期了,由于 ’ 消费降级 ’,这次领导说没有预算给到证书了 …
于是使用了 certd 的开源方案,之前星哥写的 部署的 certd,运行了几个月的时间,可以申请免费的 ssl 证书。
安装的是 v1.31.2 版,无法使用 godaddy 的 api key,后台没有设置的选项,最近更新。

整理需求如下:
-
确认 certd 新版版本支持 godaddy
-
如果支持则升级 certd(确保数据完整性)
-
申请 godaddy 的 APIKEY
-
自动更新证书
如图,新版的已经支持 godaddy 了。

升级 Certd
因为之前已经安装 certd,现在只需要升级 docker 镜像。
数据都保留在“/data/docker/certd/data”,一定要记得备份数据。
1. 进入安装目录
远程 ssh 服务器
cd /data/docker/certd
2. 查看 docker-compose
cat docker-compose.yaml
version: '3.3' # 兼容旧版 docker-compose
services:
certd:
# 镜像 # ↓↓↓↓↓ ---- 镜像版本号,建议改成固定版本号, 例如:certd:1.29.0
image: registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest
container_name: certd # 容器名
restart: unless-stopped # 自动重启
volumes:
# ↓↓↓↓↓ -------------------------------------------------------- 数据库以及证书存储路径, 默认存在宿主机的 /data/certd/ 目录下,【您需要定时备份此目录,以保障数据容灾】
# 只要修改冒号前面的,冒号后面的 /app/data 不要动
- /data/docker/certd/data:/app/data
ports: # 端口映射
# ↓↓↓↓ ---------------------------------------------------------- 如果端口有冲突,可以修改第一个 7001 为其他不冲突的端口号,第二个 7001 不要动
- "7001:7001"
# ↓↓↓↓ ---------------------------------------------------------- https 端口,可以根据实际情况,是否暴露该端口
#- "7002:7002"
#↓↓↓↓ -------------------------------------------------------------- 如果出现 getaddrinfo ENOTFOUND 错误,可以尝试设置 dns
# dns:
# - 223.5.5.5 # 阿里云公共 dns
# - 223.6.6.6
# # ↓↓↓↓ --------------------------------------------------------- 如果你服务器在腾讯云,可以用这个替换上面阿里云的公共 dns
# - 119.29.29.29 # 腾讯云公共 dns
# - 182.254.116.116
# # ↓↓↓↓ --------------------------------------------------------- 如果你服务器部署在国外,可以用这个替换上面阿里云的公共 dns
# - 8.8.8.8 # 谷歌公共 dns
# - 8.8.4.4
# extra_hosts:
# # ↓↓↓↓ -------------------------------------------------------- 这里可以配置自定义 hosts,外网域名可以指向本地局域网 ip 地址
# - "localdomain.com:192.168.1.3"
# # ↓↓↓↓ ------------------------------------------------ 直接使用主机的网络,如果网络问题实在找不到原因,可以尝试打开此参数
# network_mode: host
labels:
com.centurylinklabs.watchtower.enable: "true"
# ↓↓↓↓ -------------------------------------------------------------- 启用 ipv6 网络,还需要把下面 networks 的注释放开
# networks:
# - ip6net
environment:
# 设置环境变量即可自定义 certd 配置
# 配置项见:packages/ui/certd-server/src/config/config.default.ts
# 配置规则:certd_ + 配置项, 点号用_代替
# #↓↓↓↓ ----------------------------- 如果忘记管理员密码,可以设置为 true,重启之后,管理员密码将改成 123456,然后请及时修改回 false
- certd_system_resetAdminPasswd=false
# 默认使用 sqlite 文件数据库,如果需要使用其他数据库,请设置以下环境变量
# 注意:选定使用一种数据库之后,不支持更换数据库。
# 数据库迁移方法:1、使用新数据库重新部署一套,然后将旧数据同步过去,注意 flyway_history 表的数据不要同步
# #↓↓↓↓ ----------------------------- 使用 postgresql 数据库,需要提前创建数据库
# - certd_flyway_scriptDir=./db/migration-pg # 升级脚本目录
# - certd_typeorm_dataSource_default_type=postgres # 数据库类型
# - certd_typeorm_dataSource_default_host=localhost # 数据库地址
# - certd_typeorm_dataSource_default_port=5433 # 数据库端口
# - certd_typeorm_dataSource_default_username=postgres # 用户名
# - certd_typeorm_dataSource_default_password=yourpasswd # 密码
# - certd_typeorm_dataSource_default_database=certd # 数据库名
# #↓↓↓↓ ----------------------------- 使用 mysql 数据库,需要提前创建数据库 charset=utf8mb4, collation=utf8mb4_bin
# - certd_flyway_scriptDir=./db/migration-mysql # 升级脚本目录
# - certd_typeorm_dataSource_default_type=mysql # 数据库类型,或者 mariadb
# - certd_typeorm_dataSource_default_host=localhost # 数据库地址
# - certd_typeorm_dataSource_default_port=3306 # 数据库端口
# - certd_typeorm_dataSource_default_username=root # 用户名
# - certd_typeorm_dataSource_default_password=yourpasswd # 密码
# - certd_typeorm_dataSource_default_database=certd # 数据库名
# ↓↓↓↓ --------------------------------------------------------- 自动升级,上面 certd 的版本号要保持为 latest
# certd-updater: # 添加 Watchtower 服务
# image: containrrr/watchtower:latest
# container_name: certd-updater
# restart: unless-stopped
# volumes:
# - /var/run/docker.sock:/var/run/docker.sock
# # 配置 自动更新
# environment:
# - WATCHTOWER_CLEANUP=true # 自动清理旧版本容器
# - WATCHTOWER_INCLUDE_STOPPED=false # 不更新已停止的容器
# - WATCHTOWER_LABEL_ENABLE=true # 根据容器标签进行更新
# - WATCHTOWER_POLL_INTERVAL=600 # 每 10 分钟检查一次更新
# ↓↓↓↓ -------------------------------------------------------------- 启用 ipv6 网络,还需要把上面 networks 的注释放开
#networks:
# ip6net:
# enable_ipv6: true
# ipam:
# config:
# - subnet: 2001:db8::/64
查看镜像、查看运行的容器:
查看镜像
docker images|grep certd
registry.cn-shenzhen.aliyuncs.com/handsfree/certd latest 64080b99294c 7 months ago 651MB
查看运行的容器:
docker ps|grep certd
c9e0a2ac843b registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest "docker-entrypoint.s…" 7 months ago Up 7 months 0.0.0.0:7001->7001/tcp, 7002/tcp certd
3. 停止并且删除容器
再次提醒,一定要备份数据!
docker stop certd
docker rm -f certd
4. 删除镜像
删除镜像
docker rmi < 镜像 id>
docker rmi 64080b99294c
5. 启动
docker compose up -d
WARN[0000] /data/docker/certd/docker-compose.yaml: `version` is obsolete
[+] Running 5/11
⠼ certd [⣿⣤⣿⣿⣿⣀⣿⣀⠀⠀] Pulling 7.4s
✔ 2d35ebdb57d9 Pull complete 1.1s
⠧ 9682177f5dda Downloading [============================>] 29.38MB/51.55MB 6.8s
✔ e910c7b62cc7 Download complete 0.4s
✔ eb9e06b66aae Download complete 0.5s
✔ cbfaeef5880e Download complete
确认是否升级
升级前 v1.31.2

升级后 v1.37.4

认证有了 godaddy 的授权
也多了一些其他的平台

再申请 godaddy 的 APIKEY
使用 CNAME 认证
1. 添加 CNAME 管理
如图进入后台
点击 cname 记录管理,添加,填写域名

2. 添加域名解析记录
添加之后到 godaddy 里面添加一条 cname 记录。

3. 认证成功申请 ssl 证书
点击认证,成功之后
再申请 ssl 证书的时候使用“CNAME 代理认证”

Godaddy 申请 APIKEY
到最后才发现,这步不用操作!
认证成功 → 说明 API Key/Secret 是正确的。
权限不足 → GoDaddy 新政策要求:
DNS/ 域名管理 API:账户必须拥有 ≥10 个域名 或者订阅 Discount Domain Club(优惠域名计划)。
可用性 / 批量查询 API:账户必须拥有 ≥50 个域名 才能使用。
如果不满足条件,就会返回 ACCESS_DENIED 错误。

不过还是记录一下
1. 登录 godaddy
GoDaddy 开发者中心
https://developer.godaddy.com/
2. 点击 API Keys

3. 进入 API Key Management
进入 API Key Management 后,点击 [Create New API Key] 进行创建 API Key

4. 创建 API Key
创建 API Key 时,注意选择 Environment,必须选择 Production。

5. 保存 Key 和 Secret

6. 在 Certd 中添加 DNS 授权

7. 测试

报错
错误:请求连接超时,Error【https://api.godaddy.com/v1/domains?limit=1】
最后
最后的最后,cname 认证就可以解决问题的。浪费了一个下午,去配置 APKKEY 和 https_proxy 的代理。
以前要手动申请、下载、替换证书,搞不好还会因为忘记续期导致网站挂掉。现在使用云服务商的 API Key+CNAME 认证的配合 certed,整个流程全自动跑起来,省心又稳妥。






