1Panel 推送 SSL 证书到阿里云、腾讯云

本文首发于 Anyeの小站,点击链接 访问原文体验更佳

前言

都用 CDN 了还在乎那点 1 年证书钱么? 开句玩笑话,按照 Apple 的说法,证书有效期不该超过 45 天。那么证书有效期的缩短意味着要更频繁地更新证书。对于我这样的“裸奔”站点来说,自动续签的 ZeroSSL 证书影响不是很大,但是对于使用 CDN 的站点来说,频繁更新证书可能会带来额外的管理成本和复杂性。

那么就不得不提到 1Panel 在 v1.10.12-lts 引入的功能:https://github.com/1Panel-dev/1Panel/pull/5517,在 1Panel 自动续签证书后允许用户自定义脚本来实现高阶功能,这不就是给 CDN 推送量身打造的吗?

好吧,基于群里很多小伙伴有这个需求,那么我就用 王总 倾向的 Docker 来实现。

制作不易,点个赞再走吧。

获取 ID & Key

这点相信会使用 DNS 申请证书的用户都明白,如果不会,请看:

https://help.aliyun.com/zh/cli/configure-credentialshttps://console.cloud.tencent.com/cam/capi

获取到

ALIBABA_CLOUD_ACCESS_KEY_ID  # 阿里云AccessKey ID
ALIBABA_CLOUD_ACCESS_KEY_SECRET # 阿里云AccessKey Secret

TENCENTCLOUD_SECRET_ID  # 腾讯云Secret ID
TENCENTCLOUD_SECRET_KEY # 腾讯云Secret Key

构建二合一 Cli 镜像

在 1Panel 侧边栏 容器 -> 镜像 中选择 构建镜像 ,名称填写 aliyun-tccli ,编辑内容如下:

FROM alpine:latest

RUN if curl -s https://cloudflare.com/cdn-cgi/trace | grep -q 'loc=CN' || [ $? -ne 0 ]; then \
        sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories; \
        pip_conf="https://pypi.tuna.tsinghua.edu.cn/simple"; \
    else \
        pip_conf="https://pypi.org/simple"; \
    fi \
    && apk add --no-cache python3 py3-pip jq wget curl \
    && pip config set global.index-url $pip_conf

RUN wget https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz \
    && tar -xvzf aliyun-cli-linux-latest-amd64.tgz \
    && rm aliyun-cli-linux-latest-amd64.tgz \
    && mv aliyun /usr/local/bin/ \
    && mkdir -p /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2

RUN python3 -m venv /opt/venv \
    && . /opt/venv/bin/activate \
    && pip install --no-cache-dir tccli

ENV PATH="/opt/venv/bin:$PATH"
ENV ALIBABA_CLOUD_PROFILE=AkProfile
ENV ALIBABA_CLOUD_IGNORE_PROFILE=TRUE
ENV ALIBABA_CLOUD_REGION_ID=cn-hangzhou

RUN echo '#!/bin/sh' > /entrypoint.sh && \
    echo '' >> /entrypoint.sh && \
    echo 'CLOUD_PROVIDER="$1"' >> /entrypoint.sh && \
    echo 'SERVICE_TYPE="$2"' >> /entrypoint.sh && \
    echo 'DOMAIN_NAME="${DomainName}"' >> /entrypoint.sh && \
    echo '' >> /entrypoint.sh && \
    echo 'if [ -z "$CLOUD_PROVIDER" ] || [ -z "$SERVICE_TYPE" ] || [ -z "$DOMAIN_NAME" ]; then' >> /entrypoint.sh && \
    echo '  echo "错误: 缺少必要的参数。请提供 CLOUD_PROVIDER, SERVICE_TYPE 和 DOMAIN_NAME 参数。"' >> /entrypoint.sh && \
    echo '  exit 1' >> /entrypoint.sh && \
    echo 'fi' >> /entrypoint.sh && \
    echo '' >> /entrypoint.sh && \
    echo 'if [ "$CLOUD_PROVIDER" = "aliyun" ]; then' >> /entrypoint.sh && \
    echo '  if [ "$SERVICE_TYPE" != "cdn" ] && [ "$SERVICE_TYPE" != "dcdn" ]; then' >> /entrypoint.sh && \
    echo '    echo "错误: 对于阿里云,支持的服务类型只有 cdn 和 dcdn。"' >> /entrypoint.sh && \
    echo '    exit 1' >> /entrypoint.sh && \
    echo '  fi' >> /entrypoint.sh && \
    echo '  SSLPub=$(cat /ssl/fullchain.pem)' >> /entrypoint.sh && \
    echo '  SSLPri=$(cat /ssl/privkey.pem)' >> /entrypoint.sh && \
    echo '  if [ "$SERVICE_TYPE" = "cdn" ]; then' >> /entrypoint.sh && \
    echo '    echo "同步证书到阿里云 CDN..."' >> /entrypoint.sh && \
    echo '    aliyun cdn SetCdnDomainSSLCertificate --DomainName "$DOMAIN_NAME" --CertType upload --SSLProtocol on --SSLPub="$SSLPub" --SSLPri="$SSLPri"' >> /entrypoint.sh && \
    echo '    if [ $? -eq 0 ]; then' >> /entrypoint.sh && \
    echo '      echo "阿里云 CDN 证书同步成功。"' >> /entrypoint.sh && \
    echo '    else' >> /entrypoint.sh && \
    echo '      echo "阿里云 CDN 证书同步失败。"' >> /entrypoint.sh && \
    echo '      exit 1' >> /entrypoint.sh && \
    echo '    fi' >> /entrypoint.sh && \
    echo '  elif [ "$SERVICE_TYPE" = "dcdn" ]; then' >> /entrypoint.sh && \
    echo '    echo "同步证书到阿里云 DCDN..."' >> /entrypoint.sh && \
    echo '    aliyun dcdn SetDcdnDomainSSLCertificate --DomainName "$DOMAIN_NAME" --CertType upload --SSLProtocol on --SSLPub="$SSLPub" --SSLPri="$SSLPri"' >> /entrypoint.sh && \
    echo '    if [ $? -eq 0 ]; then' >> /entrypoint.sh && \
    echo '      echo "阿里云 DCDN 证书同步成功。"' >> /entrypoint.sh && \
    echo '    else' >> /entrypoint.sh && \
    echo '      echo "阿里云 DCDN 证书同步失败。"' >> /entrypoint.sh && \
    echo '      exit 1' >> /entrypoint.sh && \
    echo '    fi' >> /entrypoint.sh && \
    echo '  fi' >> /entrypoint.sh && \
    echo '' >> /entrypoint.sh && \
    echo 'elif [ "$CLOUD_PROVIDER" = "tencent" ]; then' >> /entrypoint.sh && \
    echo '  if [ "$SERVICE_TYPE" != "cdn" ] && [ "$SERVICE_TYPE" != "eo" ]; then' >> /entrypoint.sh && \
    echo '    echo "错误: 对于腾讯云,支持的服务类型只有 cdn 和 eo。"' >> /entrypoint.sh && \
    echo '    exit 1' >> /entrypoint.sh && \
    echo '  fi' >> /entrypoint.sh && \
    echo '  CertificatePublicKey=$(cat /ssl/fullchain.pem)' >> /entrypoint.sh && \
    echo '  CertificatePrivateKey=$(cat /ssl/privkey.pem)' >> /entrypoint.sh && \
    echo '  resp=$(tccli ssl UploadCertificate --cli-unfold-argument --CertificatePublicKey "$CertificatePublicKey" --CertificatePrivateKey "$CertificatePrivateKey")' >> /entrypoint.sh && \
    echo "  CertificateId=\$(echo \$resp | egrep -o '\"CertificateId\": \"[^\"]+\"' | cut -d'\"' -f4)" >> /entrypoint.sh && \
    echo '' >> /entrypoint.sh && \
    echo '  if [ "$SERVICE_TYPE" = "cdn" ] || [ "$SERVICE_TYPE" = "ecdn" ]; then' >> /entrypoint.sh && \
    echo '    echo "同步证书到腾讯云 CDN/ECDN..."' >> /entrypoint.sh && \
    echo '    tccli ssl DeployCertificateInstance --cli-unfold-argument --CertificateId "$CertificateId" --InstanceIdList "$DOMAIN_NAME" --ResourceType cdn --Status 1' >> /entrypoint.sh && \
    echo '    if [ $? -eq 0 ]; then' >> /entrypoint.sh && \
    echo '      echo "腾讯云 CDN/ECDN 证书同步成功。"' >> /entrypoint.sh && \
    echo '    else' >> /entrypoint.sh && \
    echo '      echo "腾讯云 CDN/ECDN 证书同步失败。"' >> /entrypoint.sh && \
    echo '      exit 1' >> /entrypoint.sh && \
    echo '    fi' >> /entrypoint.sh && \
    echo '  elif [ "$SERVICE_TYPE" = "eo" ]; then' >> /entrypoint.sh && \
    echo '    echo "同步证书到腾讯云 EO..."' >> /entrypoint.sh && \
    echo '    tccli ssl DeployCertificateInstance --cli-unfold-argument --CertificateId "$CertificateId" --InstanceIdList "$DOMAIN_NAME" --ResourceType eo --Status 1' >> /entrypoint.sh && \
    echo '    if [ $? -eq 0 ]; then' >> /entrypoint.sh && \
    echo '      echo "腾讯云 EO 证书同步成功。"' >> /entrypoint.sh && \
    echo '    else' >> /entrypoint.sh && \
    echo '      echo "腾讯云 EO 证书同步失败。"' >> /entrypoint.sh && \
    echo '      exit 1' >> /entrypoint.sh && \
    echo '    fi' >> /entrypoint.sh && \
    echo '  fi' >> /entrypoint.sh && \
    echo '' >> /entrypoint.sh && \
    echo 'else' >> /entrypoint.sh && \
    echo '  echo "错误: 不支持的云服务提供商 $CLOUD_PROVIDER。"' >> /entrypoint.sh && \
    echo '  exit 1' >> /entrypoint.sh && \
    echo 'fi' >> /entrypoint.sh

RUN chmod +x /entrypoint.sh

CMD ["/entrypoint.sh"]

等待构建成功。

申请证书后执行脚本

docker run --rm --name aliyun-tccli \
    -e ALIBABA_CLOUD_ACCESS_KEY_ID=aliyun_access_key_id \
    -e ALIBABA_CLOUD_ACCESS_KEY_SECRET=aliyun_access_key_secret \
    -e TENCENTCLOUD_SECRET_ID=tencloud_secret_id \
    -e TENCENTCLOUD_SECRET_KEY=tencloud_secret_key \
    -e DomainName=youdomain.com \
    -v /path/to/ssl:/ssl \
    aliyun-tccli "/entrypoint.sh" "[aliyun|tencent]" "[cdn|dcdn|eo]"

前四个环境变量即获取到的 Key,需要推送到阿里云就只写阿里云的 AK 即可,腾讯云同理。

DomainName 的值为你在云厂商配置的域名(一般就是最终访问的域名)。

/path/to/ssl 填写上面配置的推送目录,如我这里的 /root/ssl/anye.xyz

  1. 若使用的是阿里云 CDN 内容分发网络:https://www.aliyun.com/product/cdn,则最后一行选择 aliyun cdn ,即 aliyun-tccli "/entrypoint.sh" "aliyun" "cdn"

  2. 若使用的是阿里云全站加速 DCDN:https://www.aliyun.com/product/dcdn,则最后一行选择 aliyun dcdn ,即 aliyun-tccli "/entrypoint.sh" "aliyun" "dcdn"

  3. 若使用的是腾讯云内容分发网络 CDN / 全站加速网络 ECDN:https://cloud.tencent.com/product/cdn/https://cloud.tencent.com/product/ecdn,则最后一行选择 tencent cdn ,即 aliyun-tccli "/entrypoint.sh" "tencent" "cdn"

  4. 若使用的是腾讯云边缘安全加速平台 EO:https://cloud.tencent.com/product/teo,则最后一行选择 tencent eo ,即 aliyun-tccli "/entrypoint.sh" "tencent" "eo"

开始自动化之旅吧~

后记

** 腾讯云的 SDK 奇奇怪怪的,调用还反复横跳,上传反应还慢半拍,一言难尽。。。彻夜未眠

腾讯云的 EO 没测试,成本有些高,不过应该没啥问题,有问题的话望各位大佬写在评论区,我会尽快修改。

参考资料

[1] https://github.com/cabforum/servercert/pull/553

[2] https://github.com/aliyun/aliyun-cli

[3] https://github.com/TencentCloud/tencentcloud-cli

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/916897.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

推荐一款高效的网站数据抓取工具:SysNucleus WebHarvy

SysNucleus WebHarvy是一款高效的网站数据抓取工具,支持从网页中提取文本、图像、URL 和电子邮件等内容,无需编写任何代码或脚本即可轻松实现数据抓取。用户可以通过 WebHarvy 内置的浏览器直观地浏览网页,指引软件提取所需的数据。它通过自动…

Codeforces Round 987 (Div. 2)(前四道)

A. Penchick and Modern Monument 翻译: 在繁华大都市马尼拉的摩天大楼中,菲律宾最新的 Noiph 购物中心刚刚竣工!建筑管理方 Penchick 订购了一座由 n 根支柱组成的先进纪念碑。 纪念碑支柱的高度可以用一个由 n 个正整数组成的数组 h 来表示…

【Qt实现虚拟键盘】

Qt实现虚拟键盘 🌟项目分析🌟实现方式🌟开发流程 🌟项目分析 需求:为Linux环境下提供可便捷使用的虚拟键盘OS环境:Windows 7/11、CentOS 7开发语言:Qt/C IDE:QtCreator 、Qt5.14.2功…

数字孪生驱动的智能决策:提升管理效率的关键技术

在现代的数字化转型过程中,数字孪生技术成为许多行业实现智能化升级的重要推动力。而作为领先的可视化平台,山海鲸可视化通过其强大的鲸孪生组件,将数字孪生技术与可视化紧密结合,为企业和行业用户提供了一种全新的方式来管理、监…

蓝桥杯——数组

1、移动数组元素 package day3;import java.util.Arrays;public class Demo1 {public static void main(String[] args) {int[] arr {1,2,3,4,5,6};int k 2;int[] arr_new f(arr,k);for (int i : arr_new) {System.out.print(i",");}//或System.out.println();St…

C++(Qt)软件调试---内存泄漏分析工具MTuner (25)

C(Qt)软件调试—内存泄漏分析工具MTuner (25) 文章目录 C(Qt)软件调试---内存泄漏分析工具MTuner (25)[toc]1、概述🐜2、下载MTuner🪲3、使用MTuner分析qt程序内存泄漏🦧4、相关地址&#x1f41…

AI视频处理软件行业分析与未来预测

AI视频处理软件是利用人工智能(AI)技术来增强、编辑和处理视频内容的应用程序或工具。这类软件通常提供多种功能,能够自动化一定的处理流程,提升视频制作效率和质量。以下是一些常见的AI视频处理软件功能: 1.自动剪辑…

数据结构—栈和队列

目录 1.栈底层结构的选择 2.栈的实现 3.栈 3.1入栈 3.2出栈 3.3栈顶删除 4.队列 4.1队列介绍 4.2队列初始化 4.3入队列 4.4队头删除 1.栈底层结构的选择 栈是一种数据结构 具有“后进先出的”的特点 现在面临的两种选择,一种是顺序表,另一种…

解决Windows远程桌面 “为安全考虑,已锁定该用户账户,原因是登录尝试或密码更改尝试过多。请稍后片刻再重试,或与系统管理员或技术支持联系“问题

当我们远程连接服务器连接不上并提示“为安全考虑,已锁定该用户账户,原因是登录尝试或密码更改尝试过多。请稍候片刻再重试,或与系统管理员或技术支持联系”时,根本原因是当前计算机远程连接时输入了过多的错误密码,触…

Marp for VScode插件 PPT无法预览的问题

优质好文:https://blog.csdn.net/lyuhaochina/article/details/141527208 这是因为很多人在VScode中安装markdown插件时都会安装插件Markdown Preview Enhanced,这个插件会和Marp插件的预览功能产生冲突,导致用Marp插件做的PPT无法预览 找到设置选项Markdown-previe…

实验一:自建Docker注册中心

基于容器安装运行Registry Docker Registry主要负责镜像仓库的管理 创建并启动一个运行Docker Registry: docker run -d -p 5000:5000 --restartalways --name myregistry -v /opt/data/registry:/var/lib/registry registry -v:将主机的本地/opt/data/registry目…

路漫漫其修远兮,吾将上下而求索---第一次使用github的过程记录和个人感受

文章目录 1.仓库位置2.新建仓库3.配置仓库4.克隆和上传5.推荐文章和我的感受 1.仓库位置 这个仓库的位置就是在我们的这个个人主页的右上角;如果是第一次注册账号的话,这个主页里面肯定是不存在仓库的,需要我们自己手动的进行创建&#xff1…

演员王子辰—专注革命题材 《前行者》后再出发

2021年10月22日在北京卫视播出的由张鲁一、聂远等人主演的电视剧《前行者》,讲述了在二十世纪三十年代初,因叛徒出卖,我上海地下党组织遭到严重破坏,革命事业陷入一片白色恐怖之中。我党情报员马天目刚从法国归来,临危…

uniapp中h5端如何引用本地json数据(json文件)

前言 uniapp读取本地json数据文件&#xff0c;有下面两种方式可以实现&#xff1a; 文件后缀为.json类型文件后缀为.js类型 这里展示后缀为.js类型的处理方式 1、在static中创建后缀为.js的文件存储json数据。 注意使用export导出 2、在要使用的页面导入 <template>…

PLC如何支持GEM300标准?SECS/GEM通讯协议

1. 提供技术服务&#xff0c;保证户使用没问题 2. 支持市场所有的常规PLC 3. 支持常规组态软件&#xff0c;如wincc、组态王、组态屏等 4. 支持各类传感器&#xff0c;私有协议、modbus、web等 5. 无需二次开发&#xff0c;只需配置映射到已有的PLC地址 GEM300协议是为了满…

快递100 物流查询API全面解析

一.基础准备 1.物流查询痛点 如何通过物流单号实时查询物流信息?如何实时查看物流地图轨迹? 使用快递 100&#xff0c;用户可以通过简单地输入快递单号来获取快递的详细物流状态&#xff0c;不仅能看到包裹目前的位置信息&#xff0c;还可以了解它的运输进展。 快递 100API…

《动手学深度学习》中d2l库的安装以及问题解决

当我们在按照《动手学深度学习》这本书或者网课学习时会有需要导入d2l库的使用。​d2I是一个与《动手学深度学习》(Dive into Deep Learning&#xff09;一书配套的开源教学库&#xff0c;它包含了作者李沐设计的深度学习相关代码和示例。这个库旨在帮助读者通过实践经验来理解…

使用 PyAnsys 在 Ansys 随机振动分析中检索螺栓连接中的力和应力

介绍 随机振动模拟通常用于评估组件承受运输过程中振动的能力。随机振动分析利用先前模态分析的频率和模式内容对通过功率谱密度 (PSD) 负载定义的频谱和功率内容进行线性叠加。在大多数装配模型中&#xff0c;螺栓连接&#xff08;由求解器变为 BEAM188 元素&#xff09;通常…

1 图的搜索 奇偶剪枝

图论——图的搜索_Alex_McAvoy的博客-CSDN博客 语雀版本 1 深度优先搜索DFS 1. 从图中某个顶点 v0 出发&#xff0c;首先访问 v0 2. 访问结点 v0 的第一个邻接点&#xff0c;以这个邻接点 vt 作为一个新节点&#xff0c;访问 vt 所有邻接点&#xff0c;直到以 vt 出发的所有节…