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 SecretTENCENTCLOUD_SECRET_ID  # 腾讯云Secret ID
TENCENTCLOUD_SECRET_KEY # 腾讯云Secret Key

构建二合一 Cli 镜像

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

FROM alpine:latestRUN 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_confRUN 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.2RUN python3 -m venv /opt/venv \&& . /opt/venv/bin/activate \&& pip install --no-cache-dir tccliENV PATH="/opt/venv/bin:$PATH"
ENV ALIBABA_CLOUD_PROFILE=AkProfile
ENV ALIBABA_CLOUD_IGNORE_PROFILE=TRUE
ENV ALIBABA_CLOUD_REGION_ID=cn-hangzhouRUN 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.shRUN chmod +x /entrypoint.shCMD ["/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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过shell脚本分析部署nginx网络服务

通过shell脚本分析部署nginx网络服务 1.接收用户部署的服务名称 [rootlocalhost xzy]# vim 1.sh [rootlocalhost xzy]# chmod x 1.sh [rootlocalhost xzy]# ./1.sh2.判断服务是否安装 已安装;自定义网站配置路径为/www;并创建共享目录和网页文件&…

tcp 超时计时器

在 TCP(传输控制协议)中有以下四种重要的计时器: 重传计时器(Retransmission Timer) 作用:用于处理数据包丢失的情况。当发送方发送一个数据段后,就会启动重传计时器。如果在计时器超时之前没有…

华为云租户网络-用的是隧道技术

1.验证租户网络是vxlan 2.验证用OVS 2.1控制节点VXLAN 本端ip(local ip)192.168.31.8 2.2计算节点VXLAN 本端ip(local ip)192.168.31.11 计算节点用的是bond0做隧道网络 2.3查看bond文件是否主备模式

【AI+教育】一些记录@2024.11.11

《清华发布工具学习框架,让ChatGPT操控地图、股票查询,贾维斯已来?》 清华发布工具学习框架,让ChatGPT操控地图、股票查询,贾维斯已来?工具学习,清华天团让 ChatGPT 拿起专业工具https://mp.we…

day-17 反转字符串中的单词

利用split()函数和substring函数 code: class Solution {public String reverseWords(String s) {int m0;while(s.charAt(m) ){m;}ss.substring(m);String arr[]s.split("[\\s]");int narr.length;String ss"";for(int in-1;i>1;i--){ssssarr[i]"…

台式电脑没有声音怎么办?台式电脑没有声音解决详解

台式电脑一般来说都是没有内置扬声器的,需要连接耳机或者是音响才可以播放音乐。那么如果遇到台式电脑没有声音的问题,我们也需要确认这些设备硬件有没问题,知道原因才可以进行处理。下面本文将为你介绍台式电脑没有声音的可能原因和解决方法…

一文速学---红黑树

文章目录 一、红黑树简介二、 红黑树特性三、红黑树插入3.1 红黑树为空3.2 父节点为黑色3.3 父节点为红色3.3.1 父亲和叔叔都是红色3.3.2 父节点为红色,叔叔节点为黑色3.3.2.1 父节点在左节点,插入节点在父亲左节点3.3.2.2 父节点在左节点,插…

gitlab容器的迁移(部署)并配置自动备份

gitlab容器的迁移(部署)并配置自动备份 本文背景为从Ubuntu服务器上迁移gitlab容器到windows并备份,若要直接拉取镜直接安装配置可直接从第二小标题参考 1、原Ubuntu的gitlab容器制作为镜像 2.1 将运行的容器制为镜像 #镜像:i…

Linux:调试器-gdb/cgdb

文章目录 一、编译成debug1、-g 选项 二、gdb调试命令1、在CentOS系统下检查安装gdb2、进入gdb模式3、quit 退出gdb4、list (简写 l)显示文件内容5、b 打断点6、 r / run运行程序7、c 让程序直接运行完 三、cgdb1、info b查看打的所有断点2、d 删除断点3…

基于差分、粒子群算法下的TSP优化对比

TSP问题,即旅行商问题(Traveling Salesman Problem),是数学领域中的一个著名问题。以下是对TSP问题的详细解释: 一、问题定义 假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的…

17.100ASK_T113-PRO 配置QT运行环境(三)

前言 1.打开QT,新建项目. 做成以下效果,会QT都没有问题吧 编译输出: /home/book/LED_and_TempHumi/build-LED_and_TempHumi-100ask-Debug LED_and_TempHumi 2.下载程序与测试 设置运行环境 export QT_QPA_PLATFORMlinuxfb 这个地方还需要加字体,不然不会显示字体.

智慧社区平台系统提升物业管理效率与居民生活质量

内容概要 智慧社区平台系统是为应对现代城市管理挑战而诞生的重要工具。随着城市化进程的加快,传统的物业管理方式已经难以满足日益增长的居民需求和管理复杂性。因此,引入智能化管理手段显得尤为重要。这个系统不仅仅是一个简单的软件,它是…

远程jupyter lab的配置

打开虚拟环境 conda activate test 在环境下安装ipykernel软件包,这个软件包允许jupyter notebookl使用特定环境的python版本。 conda install ipykernel 将该环境添加到Jupyter Notebook中 python -m ipykernel install --user --nametest --display-name&quo…

python+Django+MySQL+echarts+bootstrap制作的教学质量评价系统,包括学生、老师、管理员三种角色

项目介绍 该教学质量评价系统基于Python、Django、MySQL、ECharts和Bootstrap技术,旨在为学校或教育机构提供一个全面的教学质量评估平台。系统主要包括三种角色:学生、老师和管理员,每个角色有不同的功能权限。 学生角色:学生可…

找不到vcruntime140.dll怎么办,彻底解决vcruntime140.dll丢失的5种方法

当计算机系统中无法找到vcruntime140.dll这个特定的动态链接库文件时,可能会引发一系列运行问题,具体表现形式多样且影响范围较广。对于依赖于该文件运行的各类软件应用来说,缺失vcruntime140.dll将直接导致程序无法正常启动或执行&#xff0…

设计模式-Adapter(适配器模式)GO语言版本

前言 个人感觉Adapter模式核心就在于接口之间的转换。将已有的一些接口转换成其他接口形式。并且一般用于对象上,而不是系统上 问题 就用一个简单的问题,懂数据结构的同学可能知道双端队列。那么就用双端队列实现一个栈(stack)或…

表格的选择弹窗,选中后返显到表格中

项目场景: 提示:这里简述项目相关背景: 表格的下拉框可以直接显示选项,那如果选择框不是下拉的,而是弹窗,那么在表格中如何返显呢? 问题描述 如上图所示,点击表格中的选择&#xf…

4.STM32之通信接口《精讲》之USART通信---实验串口发送程序

本节将进行实战,基础了解请查看第1,2,3节(Whappy) 开始背!! USART ---》全双工 异步/同步 点对点 C语言基础printf用法,这节将用到printf的重定向,来打印到串口助手上…

搭建MC服务器

局域网中玩MC,直接自己创建房间开启局域网就可以了。如果想开一个24小时不关机的服务器呢?其实最开始我是想在windows云服务器,图形化界面运行一个开启局域网即可。可能是云服务器上没有显卡,还是其他什么原因,游戏打开…

css 使用图片作为元素边框

先看原始图片 再看效果 边框的四个角灭有拉伸变形,但是图片的中部是拉伸的 代码 border-style: solid;/* 设置边框图像的来源 */border-image-source: url(/static/images/mmwz/index/bk_hd3x.png);/* 设置如何切割图像 */border-image-slice: 66;/* 设置边框的宽度 */border…