惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Proofpoint News Feed
WordPress大学
WordPress大学
Help Net Security
Help Net Security
Jina AI
Jina AI
Security Latest
Security Latest
Y
Y Combinator Blog
Project Zero
Project Zero
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
GbyAI
GbyAI
Know Your Adversary
Know Your Adversary
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
NISL@THU
NISL@THU
Cisco Talos Blog
Cisco Talos Blog
博客园 - 司徒正美
MyScale Blog
MyScale Blog
Cyberwarzone
Cyberwarzone
D
Docker
T
The Blog of Author Tim Ferriss
G
Google Developers Blog
C
CERT Recently Published Vulnerability Notes
B
Blog
L
LangChain Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
SecWiki News
SecWiki News
The Hacker News
The Hacker News
C
Check Point Blog
L
Lohrmann on Cybersecurity
V2EX - 技术
V2EX - 技术
S
Securelist
T
Threat Research - Cisco Blogs
Stack Overflow Blog
Stack Overflow Blog
TaoSecurity Blog
TaoSecurity Blog
云风的 BLOG
云风的 BLOG
Latest news
Latest news
人人都是产品经理
人人都是产品经理
L
LINUX DO - 最新话题
Application and Cybersecurity Blog
Application and Cybersecurity Blog
The Register - Security
The Register - Security
Webroot Blog
Webroot Blog
Simon Willison's Weblog
Simon Willison's Weblog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Microsoft Security Blog
Microsoft Security Blog
AWS News Blog
AWS News Blog
C
Cybersecurity and Infrastructure Security Agency CISA
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
小众软件
小众软件
T
Tailwind CSS Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
宝玉的分享
宝玉的分享
O
OpenAI News

kshao-blog-前端知识记录

win or mac clash 无 TUN 让 Antigravity、Chrome 强制 proxy(解决 Antigravity 无法加载选择 model、自动更新无法登录、跳转) 【大杂烩】在 pnpm 中直接修改 node_modules(.pnpm) 中的依赖项,项目中持久化 - pnpm 中的依赖处理、幽灵依赖、寻址规则等 在 html 中直接使用 Esm、Jsx 脚本快速调试和使用 React@19 和 Vue@3 源码,解决 React19 UMD 构建等问题 一键在本地批量检测并升级更新 package.json 中的模块依赖,ncu(npm-check-updates)在 npm、pnpm 或 workspace 项目中的使用教程 解决 Mac Docker Desktop 中启动出现的问题合集 通过阿里云、腾讯云无服务器搭建自定义的企业域名邮箱,实现在 QQ邮箱 收发等功能(附腾讯 SMTP 和 IMAP) 解决使用代理(clash 等)进行 SSH 连接(如 Github ssh key clone/push)出现 kex_exchange_identification 错误 静态文件资源 cdnjs, jsdelivr 抖音字节国内快速 CDN 镜像推荐【2025】- 仍在使用 bootcdn 和 staticfile CDN 请注意验证资源的完整性(SRI) pnpm monorepo 中管理依赖的最佳实践,与 Catalogs(目录)协议的使用(monorepo 中统一版本管理) Web 安全中的 Secure Contexts(安全上下文)- 解决在本地中使用 clipboard 或 Crypto 等 API 限制或关闭上下文限制 使用 serve 配合 openssl 或 mkcert 创建本地自签名可信任的证书 - 创建本地 TLS\SSL https 协议服务 【CSS】解决在 flex 容器中使用 align-content 或 justify-content 属性 center 居中时的溢出滚动和截断问题 - 理解 safe 关键字 在线工具 - 一键获取下载抖音无水印视频、抖音去水印解析工具、下载抖音无水印高清图集【2025 最新】 【React Router】v6 data router 在非组件(或工具方法)中如何优雅的跳转路由 【React】为什么路由跳转时页面滚动高度不会被重置(保留上个页面高度)?理解 history scrollRestoration 的场景与使用,以及如何使用 React Router 重置和跳转前保留滚动高度 【React】在本地 Html 中快速 debug(调试)React 源码 【React】结合源码和 EventLoop 分析 - 为什么 useLayoutEffect 会阻止 DOM 重绘(而 useEffect 闪烁)?为什么其内部 useState 会“同步”执行? React Compiler - 解放在函数中编程时的性能焦虑(React Conf 2024)附 Next 在线演示 在 github actions 中获取时间,并转换为中国标准时间(中国时区) 【npm】npm ci - npm clean install,在 CI、CD 中保持构建的一致性和可重复性 eslint 9.x 升级或使用指南,eslint.config.js 配置,包含 react、typescript、prettier 等常用配置升级迁移 使用 Spicetify 自定义 Spotify - 歌词翻译、全屏展示、主题替换 在 node 中快速代理请求(Proxy),解决跨域或请求转发问题 - http-proxy-middleware 修改请求体和返回 在 Hexo 中使用 AI(Gemini、deepseek、Azure)生成文章摘要,支持自定义模板。hexo-ai-summaries 插件文档(默认适配主题 Butterfly) 解决在 webstorm 或 idea 等 jetbrains 工具中遇到 Git 无法 force push,或 force push 灰色禁用无法点击(protected branches) hexo-seo-submit,Hexo 博客 SEO 优化插件 - 每日定时自动或手动提交链接至百度、Bing、Google,支持 Github Actions 和 Coding Jenkins 等CI(Hexo 插件编写) 一文吃透 pnpm 如何使用 workspace 构建 monorepo,与 npm、yarn 的用法对比(pnpm 9.x 内部安装依赖问题 link-workspace-packages) 【Node】Corepack - 解决 pnpm 或 yarn 的多版本管理、解决本地版本与 packageManager 中的版本一致性问题 解决 npm、cnpm 或 pnpm install 遇到 certificate has expired (证书已过期) npm、yarn、pnpm 设置最新国内镜像源(附官方镜像源和最新阿里源),以及 nrm 的使用教程【2025】 解决从 docker desktop 内镜像 linux 创建的容器,启动就停止、无法启动等问题(无进程容器) docker(docker desktop)中设置国内镜像源加速(阿里云、中科大),以及代理和容器代理设置,解决桌面端无法登陆就退出问题 【CSS】解决外边距重叠(重合)引起的 margin 垂直方向(top、bottom)不生效,无作用的问题 【CSS】CSS-Nesting:CSS 嵌套写法 —— 有望替代 less sass 的原生嵌套 【CSS】解决移动端(高清方案)下在谷歌浏览器中出现 字体大小布局异常,和设置的 font-size 不符(Text Autosizer、Font Boosting) 【CSS】主流 UI 库都在用的逻辑伪类选择器 not、where、is、has 【windows 11】使用 wePe 纯净 制作pe启动盘 安装\重装\升级 windows 11(windows 10)详细教程,附 windows 11 跳过联网、分区等教程 【webpack】Externals(外部扩展)浅析 - webpack 5 【Windows】一句话(一键、一分钟、一段代码)清除 Windows 11(10) 快捷方式角标(小箭头) 【Git】cherry-pick 使用场景介绍,如何在 WebStorm 中使用 cherry-pick;(从分支中提取 commit 功能) 【message-channel】了解频繁出现在框架的 Message Channel,及在事件循环(Event Loop)中的表现 【web-worker】浅析 useWorker 库如何只需函数方法即可在 worker 内运行;如何区分 Web Socket、Web Worker和Service Worker? 【React】理解学习 React 17中的批处理 与 18 批处理 为何用谷歌(Chrome)浏览器下载PDF时有时预览有时下载? 【less】Parent Selectors & 和 &&(多个父选择器的用法及回顾) 【React Router】在非组件(或工具方法)中如何优雅的跳转路由 - 理解 HashHistory 和 BrowserHistory 处理谷歌浏览器(google Chrome)https 站点将 http 资源自动转成 https - 附全站资源强制转 https vscode 国内直链接下载,提升(加速)下载速度 【css-tricks】从 flex 子元素超出父级(容器)宽度,探其原理 flex:1 时 width 的作用 linux,mac 终端(Terminal)上使用代理(http/https/socks5)提升速度,给 git 一键设置代理提升速度 修复 Win 11或10 Xbox Game Bar 录屏截屏打不开灰色等 ios,Windows 网页皆可平滑、惯性滚动(Smooth-scroll.js)- 博客、网站、web、JavaScript 【2022年】apple 苹果(ios)注册美服区(日区)ID教程(附免税地区及身份信息生成器)-时效:2022年2月 javaScript 文件上传 - input 上传 和 webAPi 上传(解决上传对 input 的依赖) Git 解决 pull 操作出现:不建议在没有为偏离分支指定合并策略时执行pull操作 一行代码解决谷歌浏览器出现:"您的连接不是私密连接" Nginx 中使用 cookie 灰度或分流 css 指定方向模糊 - 鸿蒙开机效果(animation 事件) PE 升级 windows11 解决不满足限制(绕开 TPM),顺带 surface pro 一键升级 windows11(无需 PE) 在 Hexo 中一键部署 github page 并同步 push 变更文件到指定分支(hexo-deployer-git) z390 + i79700 + rx560(讯景转蓝宝石) 双显卡双系统 - openCore 0.6x 黑苹果 BigSur 11.4(20F71) Progressive JPEG - Web 前端 渐进(模糊)加载图片 z390+英伟达1060+i7 9700 安装黑苹果教程(避坑)- MAC OS 10.13.6 饿了么外卖红包-百亿补贴(每天都可免费领),来自内部的优惠! Google AdSense 添加付款方式-使用银行外汇(招行外汇) ECMAScript2021 可用新特性 客户端或服务端 cookie 的设置、读取、携带问题 css 文字渐入效果,css 变量的进一步使用 setProperty Css 模拟赛博朋克 故障风格 按钮 Fetch、Ajax 请求遇到301或302时 记录前后端不同域名 携带 cookie,及如何处理 Chrome SameSite Mac下 Nginx、openssl,配置本地 Localhost Https 测试环境 在线生成短链接,新浪短链接 t.cn webStorm 开发,配置 ts(TypeScript)的 FileWatchers 微信小程序 - typeScript 的配置与热加载 win10 重装系统,电脑出现:"由于最近更改电脑硬件而无法正常启动",或重装卡在:"海内存知己"等问题解决方法 算法- js 二叉树,二叉查找树的基本实现及递归与循环的版本 异或运算符 ^ 理解与应用 面试 - js 在指定数组中找出不重复的两数之和为 target
利用 Github Actions 和 Acme 自动申请、更新和部署至阿里云、腾讯云 CDN Lets Encrypt SSl\TLS ECC RSA 双证书
kshao · 2024-09-10 · via kshao-blog-前端知识记录

早在去年年底和今年年初,各大证书厂商都陆续限制了免费 SSL 证书的有效期,从 12 个月缩短至 3 个月。时间将至,来看本文的兄弟们证书是否快要过期了?哈哈~

ACME: Automatic Certificate Management Environment(自动证书管理环境),是一种用于自动化管理和获取 SSL\TLS 证书的协议

ACME 提供了一种标准化的方式,使能够自动请求、验证和获取证书,无需人工干预。完成标准化的获取证书流程需要 ACME 客户端与 ACME 服务端进行通信,常见的 ACME 的客户端有:acme.shcertbot

本文将使用 ACME 协议的 acme.sh 客户端脚本和支持 ACME 服务端的 CA Let’s Encrypt 实现自动证书管理,并自动部署至腾讯云和阿里云 CDN。

acme.sh

主要实现逻辑依靠 acme.sh 的证书申请 和 dns 验证。

相关命令

帮助理解 acme 脚本,方便后续自定义,若无需求可忽略。(actionsubuntu 环境,理论其他环境逻辑同。若需要自定义,建议先阅读文档)

安装 acme.sh

curl  https://get.acme.sh | sh -s email=$EMAIL

执行完上述命令后,会创建并复制 acme 脚本至 ~/.acme.sh/actions/home/runner/.acme.sh),后续安装的证书默认也会在此文件夹下。

email 参数为申请证书使用的邮箱,例如 Let’s EncryptACME 服务端需要邮箱注册账户、提供邮件提醒等。

生成证书 - DNSpod

  1. 使用 DNSpod api--dns dns_dp)进行自动域名 TXT 解析,验证域名所有权。
  2. DNSpod Token 中获取的 ID(对应 DP_Id) 和 Token(对应 DP_Key
  3. 使用 证书 CAletsencrypt --server letsencrypt
  4. -dksh7.com*.ksh7.com 为多个域名申请证书(或泛域名证书)
export DP_Id="1234"

export DP_Key="sADDsdasdgdsf"

acme.sh --issue --server letsencrypt --dns dns_dp -d ksh7.com -d *.ksh7.com

更换 CA

acme.sh 默认使用 ZeroSSL CA,命令中不指定 server 即可,若需要更换其他 CA 可参考 Server 描述。

CA 之间的对比

创建 DNSpod Token

进入 DNSpod Token 页面(点击链接进入即可,或者右上角点击 API 密钥),选择 创建密钥,获得的 IDToken 分别对应 DP_IdDP_Key

[{"url":"https://static.ksh7.com/post/ssl-cert-auto-deploy/0085UwQ9ly1htnn096gjdj30go0jcdif.webp?imageMogr2/thumbnail/!50p","dataset":{"originPic":"https://static.ksh7.com/post/ssl-cert-auto-deploy/0085UwQ9ly1htnn096gjdj30go0jcdif.webp","thumbnail":""}},{"url":"https://static.ksh7.com/post/ssl-cert-auto-deploy/0085UwQ9ly1htnmshmwllj30z60redm3.webp?imageMogr2/thumbnail/!50p","dataset":{"originPic":"https://static.ksh7.com/post/ssl-cert-auto-deploy/0085UwQ9ly1htnmshmwllj30z60redm3.webp","thumbnail":""}}]

证书验证成功后,会自动添加和删除对应的 TXT 记录,配置了几个域名就会有几条记录,可在 DNSpod 操作记录 中查看。

生成证书 - 阿里云

export Ali_Key="<key>"
export Ali_Secret="<secret>"

acme.sh --issue --dns dns_ali -d ksh7.com -d *.ksh7.com --server letsencrypt

使用主账号的 AccessKey

进入 访问凭证管理 或右上角选择 AccessKey 管理,创建 AccessKey 或者使用之前的 AccessKey 即可,AccessKey IDAccessKey Secret 分别对应 Ali_Key Ali_Secret。简单暴力,但需要注意权限。

[{"url":"https://static.ksh7.com/post/ssl-cert-auto-deploy/0085UwQ9ly1htnobahaorj30hs0fkn1j.webp?imageMogr2/thumbnail/!50p","dataset":{"originPic":"https://static.ksh7.com/post/ssl-cert-auto-deploy/0085UwQ9ly1htnobahaorj30hs0fkn1j.webp","thumbnail":""}},{"url":"https://static.ksh7.com/post/ssl-cert-auto-deploy/0085UwQ9ly1htnobak1vfj31tq0konjf.webp?imageMogr2/thumbnail/!50p","dataset":{"originPic":"https://static.ksh7.com/post/ssl-cert-auto-deploy/0085UwQ9ly1htnobak1vfj31tq0konjf.webp","thumbnail":""}}]

使用子账号的 AccessKey

子账号创建流程参考 CertCloud
更多关于 DNS API 的说明或其他平台(如 cloudflareaws 等)请参考 How to use DNS API

安装证书

申请完证书后,证书默认存放在 ~/.acme.sh/ 文件夹下(可以在 --issue 时 指定 --cert-home,或者设置环境变量 export CERT_HOME 更改路径),若你需要将证书部署至服务器的指定文件下,如 NginxApache 可使用 --installcert 命令

acme.sh --installcert -d ksh7.com -d *.ksh7.com --key-file /mycertify/ssl/ksh7.com.key --fullchain-file /mycertify/ssl/ksh7.com.cer

部署证书

使用 Actions 将证书部署至 CDN 平台

账户需要权限:QcloudCDNFullAccess、QcloudSSLFullAccess

deploy-to-tencent-cdn:
  name: Deploy certificate to Tencent Cloud CDN
  runs-on: ubuntu-latest
  # 需要在申请完证书后进行部署任务
  needs: issue

  steps:
    - name: Check out
      uses: actions/checkout@v2
      with:
        ref: ${{ github.ref }}

    - uses: renbaoshuo/deploy-certificate-to-tencentcloud@v2
      with:
        secret-id: ${{ secrets.SECRETID }}
        secret-key: ${{ secrets.SECRETKEY }}
        # cert file like ksh7.com.cer
        # 证书路径
        fullchain-file: ${{ env.CERTS_OUTPUT_DIRECTORY }}/${{ env.FILE_FULLCHAIN }}
        # 私钥路径
        key-file: ${{ env.CERTS_OUTPUT_DIRECTORY }}/${{ env.FILE_KEY }}
        cdn-domains: |
          ksh7.com

阿里云 CDN

AccessKey 的配置,可参考 生成证书-阿里云

deploy-to-aliyun:
  name: Deploy Certificate to Aliyun
  runs-on: ubuntu-latest
  needs: issue-ssl-certificate

  steps:
    - name: Checkout
      uses: actions/checkout@v2

    # 上传证书
    - name: Deploy certificate to aliyun
      uses: Menci/deploy-certificate-to-aliyun@beta-v1
      with:
        access-key-id: ${{ secrets.ALIYUN_ACCESS_KEY_ID }}
        access-key-secret: ${{ secrets.ALIYUN_ACCESS_KEY_SECRET }}
        fullchain-file: ${{ env.CERTS_OUTPUT_DIRECTORY }}/${{ env.FILE_FULLCHAIN }}
        key-file: ${{ env.CERTS_OUTPUT_DIRECTORY }}/${{ env.FILE_KEY }}
        certificate-name: example.com
        cdn-domains: |
          ksh7.com

申请证书

在使用 Actions 之前,可以通过 acme.sh 脚本将相关流程本地测试一次,可有效减少未知问题。

需要注意!证书与密钥文件需要妥善保管,请勿使用 公开仓库储存

Menci/acme

使用 Actions 插件来快速开启证书申请流程。参数详解直达

jobs:
  issue-ssl-certificate:
    name: Issue SSL certificate
    runs-on: ubuntu-latest
    steps:
      - uses: Menci/acme@v2
        with:
          version: 3.0.2

          # Register your account and try issue a certificate with DNS API mode
          # Then fill with the output of `tar cz ca account.conf | base64 -w0` running in your `~/.acme.sh`
          account-tar: ${{ secrets.ACME_SH_ACCOUNT_TAR }}

          domains: example.com example.net example.org example.edu
          domains-file: ''
          append-wildcard: true

          arguments: --dns dns_cf --challenge-alias example.com
          arguments-file: ''

          output-fullchain: output/fullchain.pem
          output-key: output/key.pem
          output-pfx: output/certificate.pfx
          output-pfx-password: qwq

          # uninstall: true # Uninstall acme.sh after this action by default

自定义 acme.shActions

支持自动申请证书、以及每天检查证书是否过期,并自动重新申请证书(时间小于30天)。申请 ECCRSA泛域名证书。

使用 腾讯 CDN 的完整案例,详细文档和参数请转至:auto-ssl-cert

name: DnsPod SSL Certificates

on:
  schedule: # execute every 24 hours
    - cron: '35 6 * * *'
  workflow_dispatch:

env:
  ACME: /home/runner/.acme.sh/acme.sh
  DP_ID: ${{ secrets.DP_ID }}
  DP_KEY: ${{ secrets.DP_KEY }}
  EMAIL: ${{ secrets.EMAIL }}

jobs:
  issue-cert:
    runs-on: ubuntu-latest
    outputs:
      certificate_updated: ${{ steps.check_certificate.outputs.certificate_updated }}
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Install & Configure acme.sh
        run: |
          curl  https://get.acme.sh | sh -s email=$EMAIL
      - name: Issue & Deploy Certificates
        id: check_certificate
        run: |
          export DP_Id=$DP_ID
          export DP_Key=$DP_KEY

          git config --global user.email $EMAIL
          git config --global user.name acme

          # 如果想要其他证书发行机构,可以把 acme.sh 的ca目录拷贝到 repo 的 ca目录
          # mkdir -p /home/runner/.acme.sh/ca/
          # cp -r ca/* /home/runner/.acme.sh/ca/          

          certificate_updated=false

          check_certificate_validity() {
            cert_path=$1
            if [ -f "$cert_path" ]; then
              if openssl x509 -checkend $(( 30 * 86400 )) -noout -in "$cert_path"; then
                echo "Certificate at $cert_path is valid for more than 30 days, skipping..."
                return 0
              else
                return 1
              fi
            else
              return 1
            fi
          }

          issue_and_install_certificate() {
            domain=$1
            cert_type=$2 # "EC" or "RSA"
            acme_server=$3 # default choose "letsencrypt" 其他 CA 请参考 https://github.com/acmesh-official/acme.sh/wiki/CA
            keylength=$4 # empty for EC, "3072" for RSA

            cert_path="./ssl/$domain"
            [ "$cert_type" = "RSA" ] && cert_path="$cert_path/rsa"
            cert_file="$cert_path/$domain.cer"
            key_file="$cert_path/$domain.key"
            
            # Issue certificate          
            issue_status=0
            $ACME --issue --server $acme_server --debug --dns dns_dp -d "$domain" -d "*.$domain" ${keylength:+--keylength $keylength}|| issue_status=$?
            if [ $issue_status -ne 0 ]; then
              echo "Failed to issue $cert_type certificate for $domain, skipping..."
              return
            fi

            # Install certificate          
            install_status=0
            $ACME --installcert -d "$domain" --key-file "$key_file" --fullchain-file "$cert_file" || install_status=$?
            if [ $install_status -ne 0 ]; then
              echo "Failed to install $cert_type certificate for $domain, skipping..."
              return
            fi

            certificate_updated=true
            TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")
            git add $cert_path/
            git commit -m "Update $cert_type certificate files for $domain at $TIMESTAMP"
          }

          while IFS= read -r domain || [ -n "$domain" ]; do
            mkdir -p "./ssl/$domain/rsa"

            # Check and issue/install EC certificate
            if ! check_certificate_validity "./ssl/$domain/$domain.cer"; then
              issue_and_install_certificate "$domain" "EC" "letsencrypt" ""
            fi

            # Check and issue/install RSA certificate
            if ! check_certificate_validity "./ssl/$domain/rsa/$domain.cer"; then
              issue_and_install_certificate "$domain" "RSA" "letsencrypt" "3072"
            fi

          done < dnspod_domains_list.txt

          echo "certificate_updated=$certificate_updated" >> $GITHUB_OUTPUT

      - name: Push changes
        if: steps.check_certificate.outputs.certificate_updated == 'true'
        uses: ad-m/github-push-action@master
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}

  deploy-to-tencent-cdn:
    name: Deploy certificate to Tencent Cloud CDN
    runs-on: ubuntu-latest
    needs: issue-cert
    if: needs.build.outputs.certificate_updated == 'true'

    steps:
      - name: Check out
        uses: actions/checkout@v2
        with:
          ref: ${{ github.ref }}

      - uses: renbaoshuo/deploy-certificate-to-tencentcloud@v2
        with:
          secret-id: ${{ secrets.SECRETID }}
          secret-key: ${{ secrets.SECRETKEY }}
          # cert file like ksh7.com.cer
          fullchain-file: ${{ env.CERTS_OUTPUT_DIRECTORY }}/${{ env.FILE_FULLCHAIN }}
          key-file: ${{ env.CERTS_OUTPUT_DIRECTORY }}/${{ env.FILE_KEY }}
          cdn-domains: |
            ksh7.com

其他推荐

httpsok

https://httpsok.com/doc/

相关链接

申请证书与部署证书参考: auto-ssl-cert
申请证书参考:auto-ssl
部署腾讯 CDN Action deploy-certificate-to-tencentcloud
部署腾讯 CDN Action 功能更完善 qcloud-ssl-cdn