升级自动部署更新SSL证书系统、申请godaddy的APIKEY

78 阅读6分钟

升级自动部署更新SSL证书系统、申请godaddy的APIKEY

公司之前花钱购买的ssl证书快到期了,由于'消费降级',这次领导说没有预算给到证书了...

于是使用了certd的开源方案,之前星哥写的 免费全自动申请和自动部署更新SSL证书的开源系统-certd 部署的certd,运行了几个月的时间,可以申请免费的ssl证书。

安装的是v1.31.2版,无法使用godaddy的api key,后台没有设置的选项,最近更新。

img

整理需求如下:

    1. 确认certd新版版本支持godaddy
    1. 如果支持则升级certd(确保数据完整性)
    1. 申请godaddy的APIKEY
    1. 自动更新证书

如图,新版的已经支持godaddy了。

img

升级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

img

升级后v1.37.4

img

认证有了godaddy的授权

也多了一些其他的平台

img

再申请godaddy的APIKEY

使用CNAME认证

1.添加CNAME管理

如图进入后台

点击cname记录管理,添加,填写域名

img

2.添加域名解析记录

添加之后到godaddy里面添加一条cname记录。

img

3.认证成功申请ssl证书

点击认证,成功之后

再申请ssl证书的时候使用“CNAME代理认证”

img

Godaddy申请APIKEY

到最后才发现,这步不用操作!


    
    
    
  认证成功 → 说明 API Key/Secret 是正确的。

权限不足 → GoDaddy 新政策要求:

DNS/域名管理 API:账户必须拥有 ≥10 个域名 或者订阅 Discount Domain Club(优惠域名计划)。

可用性/批量查询 API:账户必须拥有 ≥50 个域名 才能使用。

如果不满足条件,就会返回 ACCESS_DENIED 错误。

img

不过还是记录一下

1.登录godaddy

GoDaddy开发者中心


    
    
    
  https://developer.godaddy.com/

2.点击API Keys

img

3.进入API Key Management

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

img

4.创建API Key

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

img

5.保存Key和Secret

img

6.在Certd中添加DNS授权

img

7.测试

img

报错


    
    
    
  错误:请求连接超时,Error 【https://api.godaddy.com/v1/domains?limit=1】

最后

最后的最后,cname认证就可以解决问题的。浪费了一个下午,去配置APKKEY和https_proxy的代理。

以前要手动申请、下载、替换证书,搞不好还会因为忘记续期导致网站挂掉。现在使用云服务商的API Key+CNAME认证的配合certed,整个流程全自动跑起来,省心又稳妥。