├── .github └── workflows │ ├── cloudflare-autossl.yaml │ ├── dnspod-autossl.yaml │ └── update-check-list.yml ├── .gitignore ├── CHECK_LIST.md ├── LICENSE ├── README.md ├── README_zh-CN.md ├── cloudflare_domains_list.txt ├── dnspod_domains_list.txt └── ssl └── showcolor.cc ├── rsa ├── showcolor.cc.cer └── showcolor.cc.key ├── showcolor.cc.cer └── showcolor.cc.key /.github/workflows/cloudflare-autossl.yaml: -------------------------------------------------------------------------------- 1 | name: Cloudflare SSL Certificates 2 | 3 | on: 4 | schedule: # execute every 24 hours 5 | - cron: "35 6 * * *" 6 | workflow_dispatch: 7 | 8 | env: 9 | ACME: /home/runner/.acme.sh/acme.sh 10 | CF_ACCOUNT_ID: ${{ secrets.CF_ACCOUNT_ID }} 11 | CF_TOKEN: ${{ secrets.CF_TOKEN }} 12 | EMAIL: ${{ secrets.EMAIL }} 13 | 14 | jobs: 15 | build: 16 | runs-on: ubuntu-latest 17 | if: github.event_name == 'schedule' || github.event.repository.owner.id == github.event.sender.id # 除了定时和repo owner手动触发的事件外, 其他不执行 18 | steps: 19 | - name: Checkout 20 | uses: actions/checkout@v4 21 | - name: Install & Configure acme.sh 22 | run: | 23 | curl https://get.acme.sh | sh -s email=$EMAIL 24 | - name: Issue & Deploy Certificates 25 | run: | 26 | export CF_Account_ID=$CF_ACCOUNT_ID 27 | export CF_Token=$CF_TOKEN 28 | 29 | git config --global user.email $EMAIL 30 | git config --global user.name acme 31 | 32 | # 如果想要其他证书发行机构,可以把 acme.sh 的ca目录拷贝到 repo 的 ca目录 33 | # mkdir -p /home/runner/.acme.sh/ca/ 34 | # cp -r ca/* /home/runner/.acme.sh/ca/ 35 | 36 | check_certificate_validity() { 37 | cert_path=$1 38 | if [ -f "$cert_path" ]; then 39 | if openssl x509 -checkend $(( 30 * 86400 )) -noout -in "$cert_path"; then 40 | echo "Certificate at $cert_path is valid for more than 30 days, skipping..." 41 | return 0 42 | else 43 | return 1 44 | fi 45 | else 46 | return 1 47 | fi 48 | } 49 | 50 | issue_and_install_certificate() { 51 | domain=$1 52 | cert_type=$2 # "EC" or "RSA" 53 | acme_server=$3 # default choose "letsencrypt" 其他 CA 请参考 https://github.com/acmesh-official/acme.sh/wiki/CA 54 | keylength=$4 # empty for EC, "3072" for RSA 55 | 56 | cert_path="./ssl/$domain" 57 | [ "$cert_type" = "RSA" ] && cert_path="$cert_path/rsa" 58 | cert_file="$cert_path/$domain.cer" 59 | key_file="$cert_path/$domain.key" 60 | 61 | # Issue certificate 62 | issue_status=0 63 | $ACME --issue --server $acme_server --debug --dns dns_cf -d "$domain" -d "*.$domain" ${keylength:+--keylength $keylength}|| issue_status=$? 64 | if [ $issue_status -ne 0 ]; then 65 | echo "Failed to issue $cert_type certificate for $domain, skipping..." 66 | return 67 | fi 68 | 69 | # Install certificate 70 | install_status=0 71 | $ACME --installcert -d "$domain" --key-file "$key_file" --fullchain-file "$cert_file" || install_status=$? 72 | if [ $install_status -ne 0 ]; then 73 | echo "Failed to install $cert_type certificate for $domain, skipping..." 74 | return 75 | fi 76 | 77 | TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S") 78 | git add $cert_path/ 79 | git commit -m "Update $cert_type certificate files for $domain at $TIMESTAMP" 80 | } 81 | 82 | while IFS= read -r domain || [ -n "$domain" ]; do 83 | mkdir -p "./ssl/$domain/rsa" 84 | 85 | # Check and issue/install EC certificate 86 | if ! check_certificate_validity "./ssl/$domain/$domain.cer"; then 87 | issue_and_install_certificate "$domain" "EC" "letsencrypt" "" 88 | fi 89 | 90 | # Check and issue/install RSA certificate 91 | if ! check_certificate_validity "./ssl/$domain/rsa/$domain.cer"; then 92 | issue_and_install_certificate "$domain" "RSA" "letsencrypt" "3072" 93 | fi 94 | 95 | done < cloudflare_domains_list.txt 96 | - name: Push changes 97 | uses: ad-m/github-push-action@master 98 | with: 99 | github_token: ${{ secrets.GITHUB_TOKEN }} -------------------------------------------------------------------------------- /.github/workflows/dnspod-autossl.yaml: -------------------------------------------------------------------------------- 1 | name: DnsPod SSL Certificates 2 | 3 | on: 4 | schedule: # execute every 24 hours 5 | - cron: "35 6 * * *" 6 | workflow_dispatch: 7 | 8 | env: 9 | ACME: /home/runner/.acme.sh/acme.sh 10 | DP_ID: ${{ secrets.DP_ID }} 11 | DP_KEY: ${{ secrets.DP_KEY }} 12 | EMAIL: ${{ secrets.EMAIL }} 13 | 14 | jobs: 15 | build: 16 | runs-on: ubuntu-latest 17 | if: github.event_name == 'schedule' || github.event.repository.owner.id == github.event.sender.id # 除了定时和repo owner手动触发的事件外, 其他不执行 18 | steps: 19 | - name: Checkout 20 | uses: actions/checkout@v4 21 | - name: Install & Configure acme.sh 22 | run: | 23 | curl https://get.acme.sh | sh -s email=$EMAIL 24 | - name: Issue & Deploy Certificates 25 | run: | 26 | export DP_Id=$DP_ID 27 | export DP_Key=$DP_KEY 28 | 29 | git config --global user.email $EMAIL 30 | git config --global user.name acme 31 | 32 | # 如果想要其他证书发行机构,可以把 acme.sh 的ca目录拷贝到 repo 的 ca目录 33 | # mkdir -p /home/runner/.acme.sh/ca/ 34 | # cp -r ca/* /home/runner/.acme.sh/ca/ 35 | 36 | check_certificate_validity() { 37 | cert_path=$1 38 | if [ -f "$cert_path" ]; then 39 | if openssl x509 -checkend $(( 30 * 86400 )) -noout -in "$cert_path"; then 40 | echo "Certificate at $cert_path is valid for more than 30 days, skipping..." 41 | return 0 42 | else 43 | return 1 44 | fi 45 | else 46 | return 1 47 | fi 48 | } 49 | 50 | issue_and_install_certificate() { 51 | domain=$1 52 | cert_type=$2 # "EC" or "RSA" 53 | acme_server=$3 # default choose "letsencrypt" 其他 CA 请参考 https://github.com/acmesh-official/acme.sh/wiki/CA 54 | keylength=$4 # empty for EC, "3072" for RSA 55 | 56 | cert_path="./ssl/$domain" 57 | [ "$cert_type" = "RSA" ] && cert_path="$cert_path/rsa" 58 | cert_file="$cert_path/$domain.cer" 59 | key_file="$cert_path/$domain.key" 60 | 61 | # Issue certificate 62 | issue_status=0 63 | $ACME --issue --server $acme_server --debug --dns dns_dp -d "$domain" -d "*.$domain" ${keylength:+--keylength $keylength}|| issue_status=$? 64 | if [ $issue_status -ne 0 ]; then 65 | echo "Failed to issue $cert_type certificate for $domain, skipping..." 66 | return 67 | fi 68 | 69 | # Install certificate 70 | install_status=0 71 | $ACME --installcert -d "$domain" --key-file "$key_file" --fullchain-file "$cert_file" || install_status=$? 72 | if [ $install_status -ne 0 ]; then 73 | echo "Failed to install $cert_type certificate for $domain, skipping..." 74 | return 75 | fi 76 | 77 | TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S") 78 | git add $cert_path/ 79 | git commit -m "Update $cert_type certificate files for $domain at $TIMESTAMP" 80 | } 81 | 82 | while IFS= read -r domain || [ -n "$domain" ]; do 83 | mkdir -p "./ssl/$domain/rsa" 84 | 85 | # Check and issue/install EC certificate 86 | if ! check_certificate_validity "./ssl/$domain/$domain.cer"; then 87 | issue_and_install_certificate "$domain" "EC" "letsencrypt" "" 88 | fi 89 | 90 | # Check and issue/install RSA certificate 91 | if ! check_certificate_validity "./ssl/$domain/rsa/$domain.cer"; then 92 | issue_and_install_certificate "$domain" "RSA" "letsencrypt" "3072" 93 | fi 94 | 95 | done < dnspod_domains_list.txt 96 | - name: Push changes 97 | uses: ad-m/github-push-action@master 98 | with: 99 | github_token: ${{ secrets.GITHUB_TOKEN }} -------------------------------------------------------------------------------- /.github/workflows/update-check-list.yml: -------------------------------------------------------------------------------- 1 | name: Update Check List 2 | 3 | on: 4 | schedule: # execute every 24 hours 5 | - cron: "35 23 * * *" 6 | workflow_dispatch: 7 | 8 | env: 9 | EMAIL: ${{ secrets.EMAIL }} 10 | 11 | jobs: 12 | build: 13 | runs-on: ubuntu-latest 14 | if: github.event_name == 'schedule' || github.event.repository.owner.id == github.event.sender.id 15 | steps: 16 | - name: Checkout 17 | uses: actions/checkout@v4 18 | 19 | - name: Update CHECK_LIST.md 20 | run: | 21 | git config --global user.email $EMAIL 22 | git config --global user.name acme 23 | CURRENT_TIME=$(date +"%Y-%m-%d %H:%M:%S") 24 | echo "## Certificate Status (Updated at $CURRENT_TIME)" > CHECK_LIST.md 25 | echo "| Domain | Expiry Date (EC) | Issuer (EC) | Expiry Date (RSA) | Issuer (RSA) |" >> CHECK_LIST.md 26 | echo "|--------|------------------|-------------|-------------------|--------------|" >> CHECK_LIST.md 27 | for domain_dir in ./ssl/*/; do 28 | domain=$(basename "$domain_dir") 29 | if [ -f "$domain_dir/$domain.cer" ]; then 30 | expiry_date_ec=$(openssl x509 -enddate -noout -in "$domain_dir/$domain.cer" | cut -d= -f2) 31 | issuer_ec=$(openssl x509 -issuer -noout -in "$domain_dir/$domain.cer" | cut -d, -f2) 32 | else 33 | expiry_date_ec="N/A" 34 | issuer_ec="N/A" 35 | fi 36 | 37 | if [ -f "$domain_dir/rsa/$domain.cer" ]; then 38 | expiry_date_rsa=$(openssl x509 -enddate -noout -in "$domain_dir/rsa/$domain.cer" | cut -d= -f2) 39 | issuer_rsa=$(openssl x509 -issuer -noout -in "$domain_dir/rsa/$domain.cer" | cut -d, -f2) 40 | else 41 | expiry_date_rsa="N/A" 42 | issuer_rsa="N/A" 43 | fi 44 | echo "| $domain | $expiry_date_ec | $issuer_ec | $expiry_date_rsa | $issuer_rsa |" >> CHECK_LIST.md 45 | done 46 | git add CHECK_LIST.md 47 | git commit -m "Update CHECK_LIST.md with certificate expiry dates and execution time at $CURRENT_TIME" 48 | 49 | - name: Push changes 50 | uses: ad-m/github-push-action@master 51 | with: 52 | github_token: ${{ secrets.GITHUB_TOKEN }} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/.gitignore 2 | .idea/auto-ssl.iml 3 | .idea/misc.xml 4 | .idea/modules.xml 5 | .idea/vcs.xml 6 | -------------------------------------------------------------------------------- /CHECK_LIST.md: -------------------------------------------------------------------------------- 1 | ## Certificate Status (Updated at 2025-06-20 23:41:24) 2 | | Domain | Expiry Date (EC) | Issuer (EC) | Expiry Date (RSA) | Issuer (RSA) | 3 | |--------|------------------|-------------|-------------------|--------------| 4 | | showcolor.cc | Aug 7 05:53:53 2025 GMT | O = Let's Encrypt | Aug 6 05:54:43 2025 GMT | O = Let's Encrypt | 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 danbao 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Auto-SSL - Automated SSL Certificate Management System with GitHub Actions 2 | 3 | [![License](https://img.shields.io/github/license/danbao/auto-ssl?style=flat-square)](LICENSE) 4 | [![GitHub Actions](https://img.shields.io/badge/powered%20by-GitHub%20Actions-2088FF?style=flat-square&logo=github-actions)](https://github.com/features/actions) 5 | [![Cloudflare](https://img.shields.io/badge/DNS%20Provider-Cloudflare-F38020?style=flat-square&logo=cloudflare)](https://www.cloudflare.com/) 6 | 7 | ## 🚨 Important Security Notice 8 | 9 | > **Warning: Privacy Protection** 10 | > Before using this project, please ensure: 11 | > 1. Create a **Private Repository** 12 | > 2. Push this project's code to your private repository 13 | > 14 | > ⚠️ **Never use this in public repositories, as SSL certificate private keys may be exposed** 15 | 16 | ## 📋 Project Overview 17 | 18 | Auto-SSL is an automated SSL certificate management solution based on GitHub Actions. By integrating the `acme.sh` tool, it provides secure and reliable SSL certificate auto-issuance and renewal services for your domains. 19 | 20 | ## ✨ Core Features 21 | 22 | - 🔐 **Automated Certificate Issuance**: Automatically issue SSL certificates based on ACME protocol 23 | - 🔄 **Smart Renewal Management**: Daily certificate validity checks, auto-renewal within 30 days 24 | - 📝 **Detailed Operation Logs**: Daily check reports automatically synced to `CHECK_LIST.md` 25 | - 🌐 **Wildcard Domain Support**: Support for wildcard domain certificates 26 | - 🔑 **Dual Encryption Algorithms**: Provides both ECDSA and RSA encryption algorithm certificates 27 | - 💾 **Version Control Storage**: Securely store certificate files through Git commits 28 | - ☁️ **Cloudflare Integration**: Deep integration with Cloudflare DNS API 29 | 30 | ## 🛠️ Quick Start 31 | 32 | ### Prerequisites 33 | 34 | - Own a valid domain name 35 | - Domain hosted on Cloudflare 36 | - GitHub account with repository management permissions 37 | 38 | ### Configuration Steps 39 | 40 | #### 1️⃣ Domain Preparation 41 | 42 | Ensure you own a domain name. If you need to register one, you can use the following registrars: 43 | - Alibaba Cloud 44 | - Tencent Cloud 45 | - GoDaddy 46 | - Namecheap, etc. 47 | 48 | #### 2️⃣ Cloudflare Domain Hosting 49 | 50 | Migrate your domain DNS resolution service to Cloudflare: 51 | 1. Register a [Cloudflare](https://www.cloudflare.com/) account 52 | 2. Add your domain 53 | 3. Follow the instructions to modify nameservers 54 | 4. Wait for DNS propagation to complete 55 | 56 | #### 3️⃣ Obtain Cloudflare API Credentials 57 | 58 | **Get API Token:** 59 | 1. Visit [Cloudflare API Token Management Page](https://dash.cloudflare.com/profile/api-tokens) 60 | 2. Click "Create Token" 61 | 3. Select custom token and configure the following permissions: 62 | - **Permissions**: `Zone:Zone:Read`, `Zone:DNS:Edit` 63 | - **Zone Resources**: Select target domain 64 | 65 | ![API Token Configuration Example](https://github.com/danbao/auto-ssl/assets/4090783/ea014646-8cbe-4064-a764-b45281e42e55) 66 | 67 | **Get Account ID:** 68 | 1. Log into Cloudflare dashboard 69 | 2. Select any hosted domain 70 | 3. Find "Account ID" in the right sidebar 71 | 72 | ![Account ID Location](https://github.com/danbao/auto-ssl/assets/4090783/d1d86260-89ce-4179-a0c2-e8a2361e627f) 73 | 74 | #### 4️⃣ Configure GitHub Secrets 75 | 76 | Set the following secret variables in your GitHub repository: 77 | 78 | **Path:** `Settings` → `Security` → `Secrets and variables` → `Actions` 79 | 80 | | Variable Name | Description | Example | 81 | |---------------|-------------|---------| 82 | | `CF_TOKEN` | Cloudflare API Token | `1234567890abcdef...` | 83 | | `CF_ACCOUNT_ID` | Cloudflare Account ID | `abcdef1234567890...` | 84 | | `EMAIL` | Email address for certificate application | `admin@example.com` | 85 | 86 | ![GitHub Secrets Configuration](https://github.com/danbao/auto-ssl/assets/4090783/e3ea47d8-7b3e-4605-94ee-689e6bb6ca45) 87 | 88 | #### 5️⃣ Set GitHub Actions Permissions 89 | 90 | **Path:** `Settings` → `Actions` → `General` → `Workflow permissions` 91 | 92 | Select: **Read and write permissions** 93 | 94 | ![Actions Permission Settings](https://github.com/danbao/auto-ssl/assets/4090783/abb42eb0-fd78-4417-bf07-9cf090ee7a2c) 95 | 96 | #### 6️⃣ Configure Target Domains 97 | 98 | Edit the `cloudflare_domains_list.txt` file in your repository: 99 | ```text 100 | example.com 101 | *.example.com 102 | subdomain.example.com 103 | ``` 104 | > Enter one domain per line, wildcard domains are supported 105 | 106 | #### 7️⃣ Manually Trigger First Run 107 | 108 | 1. Go to the `Actions` tab 109 | 2. Select the corresponding workflow 110 | 3. Click "Run workflow" to trigger manually 111 | 112 | ## 📊 Operation Status 113 | 114 | - **Certificate Check**: Automatically executes daily at UTC 00:00 115 | - **Renewal Threshold**: Auto-renewal when certificate validity is less than 30 days 116 | - **Status Reports**: Detailed logs recorded in `CHECK_LIST.md` file 117 | 118 | ## 🔧 Troubleshooting 119 | 120 | ### Common Issues 121 | 122 | **Q: Certificate application failed?** 123 | A: Please check: 124 | - Cloudflare API Token permission settings 125 | - Domain DNS record correctness 126 | - GitHub Secrets configuration completeness 127 | 128 | **Q: Workflow execution failed?** 129 | A: Please review: 130 | - Actions run logs 131 | - Network connection status 132 | - API call limits 133 | 134 | ### Get Support 135 | 136 | If you encounter issues, please: 137 | 1. Check the [Issues](../../issues) page 138 | 2. Submit detailed error logs 139 | 3. Describe your configuration environment 140 | 141 | ## 📄 License 142 | 143 | This project is licensed under an open source license. Please refer to the [LICENSE](LICENSE) file for details. -------------------------------------------------------------------------------- /README_zh-CN.md: -------------------------------------------------------------------------------- 1 | # Auto-SSL - 基于 GitHub Actions 的自动化 SSL 证书管理系统 2 | 3 | [![License](https://img.shields.io/github/license/danbao/auto-ssl?style=flat-square)](LICENSE) 4 | [![GitHub Actions](https://img.shields.io/badge/powered%20by-GitHub%20Actions-2088FF?style=flat-square&logo=github-actions)](https://github.com/features/actions) 5 | [![Cloudflare](https://img.shields.io/badge/DNS%20Provider-Cloudflare-F38020?style=flat-square&logo=cloudflare)](https://www.cloudflare.com/) 6 | 7 | ## 🚨 重要安全提示 8 | 9 | > **警告:隐私保护** 10 | > 使用本项目前,请务必: 11 | > 1. 创建一个**私有仓库(Private Repository)** 12 | > 2. 将本项目代码推送到您的私有仓库 13 | > 14 | > ⚠️ **切勿在公开仓库中使用,否则SSL证书私钥将面临泄露风险** 15 | 16 | ## 📋 项目简介 17 | 18 | Auto-SSL 是一个基于 GitHub Actions 的自动化 SSL 证书管理解决方案,通过集成 `acme.sh` 工具,为您的域名提供安全、可靠的 SSL 证书自动申请与续期服务。 19 | 20 | ## ✨ 核心特性 21 | 22 | - 🔐 **自动化证书申请**:基于 ACME 协议自动申请 SSL 证书 23 | - 🔄 **智能续期管理**:每日检查证书有效期,30天内自动续期 24 | - 📝 **详细运行日志**:每日检查报告自动同步至 `CHECK_LIST.md` 25 | - 🌐 **泛域名支持**:支持申请通配符域名证书 26 | - 🔑 **双重加密算法**:同时提供 ECDSA 和 RSA 两种加密算法证书 27 | - 💾 **版本控制存储**:通过 Git 提交安全存储证书文件 28 | - ☁️ **Cloudflare 集成**:深度集成 Cloudflare DNS API 29 | 30 | ## 🛠️ 快速开始 31 | 32 | ### 前置要求 33 | 34 | - 拥有有效域名 35 | - 域名已托管至 Cloudflare 36 | - GitHub 账户及仓库管理权限 37 | 38 | ### 配置步骤 39 | 40 | #### 1️⃣ 域名准备 41 | 42 | 确保您已拥有域名。如需申请,可通过以下注册商: 43 | - 阿里云 44 | - 腾讯云 45 | - GoDaddy 46 | - Namecheap 等 47 | 48 | #### 2️⃣ Cloudflare 域名托管 49 | 50 | 将您的域名 DNS 解析服务迁移至 Cloudflare: 51 | 1. 注册 [Cloudflare](https://www.cloudflare.com/) 账户 52 | 2. 添加您的域名 53 | 3. 按照指引修改域名服务器 54 | 4. 等待 DNS 传播完成 55 | 56 | #### 3️⃣ 获取 Cloudflare API 凭证 57 | 58 | **获取 API Token:** 59 | 1. 访问 [Cloudflare API Token 管理页面](https://dash.cloudflare.com/profile/api-tokens) 60 | 2. 点击「创建令牌」 61 | 3. 选择自定义令牌,配置以下权限: 62 | - **权限**:`Zone:Zone:Read`, `Zone:DNS:Edit` 63 | - **区域资源**:选择目标域名 64 | 65 | ![API Token 配置示例](https://github.com/danbao/auto-ssl/assets/4090783/ea014646-8cbe-4064-a764-b45281e42e55) 66 | 67 | **获取 Account ID:** 68 | 1. 登录 Cloudflare 控制台 69 | 2. 选择任意托管域名 70 | 3. 在右侧边栏找到「Account ID」 71 | 72 | ![Account ID 位置](https://github.com/danbao/auto-ssl/assets/4090783/d1d86260-89ce-4179-a0c2-e8a2361e627f) 73 | 74 | #### 4️⃣ 配置 GitHub Secrets 75 | 76 | 在您的 GitHub 仓库中设置以下机密变量: 77 | 78 | **路径:** `Settings` → `Security` → `Secrets and variables` → `Actions` 79 | 80 | | 变量名 | 描述 | 示例 | 81 | |--------|------|------| 82 | | `CF_TOKEN` | Cloudflare API Token | `1234567890abcdef...` | 83 | | `CF_ACCOUNT_ID` | Cloudflare Account ID | `abcdef1234567890...` | 84 | | `EMAIL` | 证书申请邮箱地址 | `admin@example.com` | 85 | 86 | ![GitHub Secrets 配置](https://github.com/danbao/auto-ssl/assets/4090783/e3ea47d8-7b3e-4605-94ee-689e6bb6ca45) 87 | 88 | #### 5️⃣ 设置 GitHub Actions 权限 89 | 90 | **路径:** `Settings` → `Actions` → `General` → `Workflow permissions` 91 | 92 | 选择:**Read and write permissions** 93 | 94 | ![Actions 权限设置](https://github.com/danbao/auto-ssl/assets/4090783/abb42eb0-fd78-4417-bf07-9cf090ee7a2c) 95 | 96 | #### 6️⃣ 配置目标域名 97 | 98 | 编辑仓库中的 `cloudflare_domains_list.txt` 文件: 99 | ```text 100 | example.com 101 | *.example.com 102 | subdomain.example.com 103 | ``` 104 | > 每行填写一个域名,支持通配符域名 105 | 106 | #### 7️⃣ 手动触发首次运行 107 | 108 | 1. 进入 `Actions` 标签页 109 | 2. 选择对应的工作流 110 | 3. 点击「Run workflow」手动触发 111 | 112 | ## 📊 运行状态 113 | 114 | - **证书检查**:每日 UTC 00:00 自动执行 115 | - **续期阈值**:证书有效期小于 30 天时自动续期 116 | - **状态报告**:详细日志记录在 `CHECK_LIST.md` 文件中 117 | 118 | ## 🔧 故障排查 119 | 120 | ### 常见问题 121 | 122 | **Q: 证书申请失败?** 123 | A: 请检查: 124 | - Cloudflare API Token 权限设置 125 | - 域名 DNS 记录是否正确 126 | - GitHub Secrets 配置是否完整 127 | 128 | **Q: 工作流执行失败?** 129 | A: 请查看: 130 | - Actions 运行日志 131 | - 网络连接状态 132 | - API 调用限制 133 | 134 | ### 获取支持 135 | 136 | 如遇到问题,请: 137 | 1. 查看 [Issues](../../issues) 页面 138 | 2. 提交详细的错误日志 139 | 3. 描述您的配置环境 140 | 141 | ## 📄 许可证 142 | 143 | 本项目采用开源许可证,详情请参见 [LICENSE](LICENSE) 文件。 -------------------------------------------------------------------------------- /cloudflare_domains_list.txt: -------------------------------------------------------------------------------- 1 | showcolor.cc 2 | -------------------------------------------------------------------------------- /dnspod_domains_list.txt: -------------------------------------------------------------------------------- 1 | example.com -------------------------------------------------------------------------------- /ssl/showcolor.cc/rsa/showcolor.cc.cer: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | 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 31 | Too2VLv6dUWzn6hLtJKG6gsg5jc6A5qw 32 | -----END CERTIFICATE----- 33 | 34 | -----BEGIN CERTIFICATE----- 35 | MIIFBTCCAu2gAwIBAgIQS6hSk/eaL6JzBkuoBI110DANBgkqhkiG9w0BAQsFADBP 36 | MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy 37 | Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa 38 | Fw0yNzAzMTIyMzU5NTlaMDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF 39 | bmNyeXB0MQwwCgYDVQQDEwNSMTAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK 40 | AoIBAQDPV+XmxFQS7bRH/sknWHZGUCiMHT6I3wWd1bUYKb3dtVq/+vbOo76vACFL 41 | YlpaPAEvxVgD9on/jhFD68G14BQHlo9vH9fnuoE5CXVlt8KvGFs3Jijno/QHK20a 42 | /6tYvJWuQP/py1fEtVt/eA0YYbwX51TGu0mRzW4Y0YCF7qZlNrx06rxQTOr8IfM4 43 | FpOUurDTazgGzRYSespSdcitdrLCnF2YRVxvYXvGLe48E1KGAdlX5jgc3421H5KR 44 | mudKHMxFqHJV8LDmowfs/acbZp4/SItxhHFYyTr6717yW0QrPHTnj7JHwQdqzZq3 45 | DZb3EoEmUVQK7GH29/Xi8orIlQ2NAgMBAAGjgfgwgfUwDgYDVR0PAQH/BAQDAgGG 46 | MB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATASBgNVHRMBAf8ECDAGAQH/ 47 | AgEAMB0GA1UdDgQWBBS7vMNHpeS8qcbDpHIMEI2iNeHI6DAfBgNVHSMEGDAWgBR5 48 | tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKG 49 | Fmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0gBAwwCjAIBgZngQwBAgEwJwYD 50 | VR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVuY3Iub3JnLzANBgkqhkiG9w0B 51 | AQsFAAOCAgEAkrHnQTfreZ2B5s3iJeE6IOmQRJWjgVzPw139vaBw1bGWKCIL0vIo 52 | zwzn1OZDjCQiHcFCktEJr59L9MhwTyAWsVrdAfYf+B9haxQnsHKNY67u4s5Lzzfd 53 | u6PUzeetUK29v+PsPmI2cJkxp+iN3epi4hKu9ZzUPSwMqtCceb7qPVxEbpYxY1p9 54 | 1n5PJKBLBX9eb9LU6l8zSxPWV7bK3lG4XaMJgnT9x3ies7msFtpKK5bDtotij/l0 55 | GaKeA97pb5uwD9KgWvaFXMIEt8jVTjLEvwRdvCn294GPDF08U8lAkIv7tghluaQh 56 | 1QnlE4SEN4LOECj8dsIGJXpGUk3aU3KkJz9icKy+aUgA+2cP21uh6NcDIS3XyfaZ 57 | QjmDQ993ChII8SXWupQZVBiIpcWO4RqZk3lr7Bz5MUCwzDIA359e57SSq5CCkY0N 58 | 4B6Vulk7LktfwrdGNVI5BsC9qqxSwSKgRJeZ9wygIaehbHFHFhcBaMDKpiZlBHyz 59 | rsnnlFXCb5s8HKn5LsUgGvB24L7sGNZP2CX7dhHov+YhD+jozLW2p9W4959Bz2Ei 60 | RmqDtmiXLnzqTpXbI+suyCsohKRg6Un0RC47+cpiVwHiXZAW+cn8eiNIjqbVgXLx 61 | KPpdzvvtTnOPlC7SQZSYmdunr3Bf9b77AiC/ZidstK36dRILKz7OA54= 62 | -----END CERTIFICATE----- 63 | -------------------------------------------------------------------------------- /ssl/showcolor.cc/rsa/showcolor.cc.key: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | 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 39 | -----END RSA PRIVATE KEY----- 40 | -------------------------------------------------------------------------------- /ssl/showcolor.cc/showcolor.cc.cer: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDljCCAxugAwIBAgISBhax5qZEdvZr3Qe5RSAYlTArMAoGCCqGSM49BAMDMDIx 3 | CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF 4 | NjAeFw0yNTA1MDkwNTUzNTRaFw0yNTA4MDcwNTUzNTNaMBcxFTATBgNVBAMTDHNo 5 | b3djb2xvci5jYzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABIV4w9kJafPAilkE 6 | Sn/G6aZT9749DRjXsRDpyLdgSCI+0L8s6+R8epslKZJ5PFFg/DcWhys3SA1rftH/ 7 | HLE+uPajggIqMIICJjAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0lBBYwFAYIKwYBBQUH 8 | AwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFOr3zwnjkm2L6kEh 9 | 8oMrqILhFSR/MB8GA1UdIwQYMBaAFJMnRpgDqVFojpjWxEJI2yO/WJTSMDIGCCsG 10 | AQUFBwEBBCYwJDAiBggrBgEFBQcwAoYWaHR0cDovL2U2LmkubGVuY3Iub3JnLzAn 11 | BgNVHREEIDAegg4qLnNob3djb2xvci5jY4IMc2hvd2NvbG9yLmNjMBMGA1UdIAQM 12 | MAowCAYGZ4EMAQIBMC0GA1UdHwQmMCQwIqAgoB6GHGh0dHA6Ly9lNi5jLmxlbmNy 13 | Lm9yZy80NC5jcmwwggEEBgorBgEEAdZ5AgQCBIH1BIHyAPAAdwDd3Mo0ldfhFgXn 14 | lTL6x5/4PRxQ39sAOhQSdgosrLvIKgAAAZaz0REXAAAEAwBIMEYCIQC+NTVmDYp0 15 | UHDJK7P+ObY/gEln0i8rTKyhij9AHXE0JAIhANBcH1Ob1F1YAHv7mQjtW9Q8B1Aq 16 | 5Z2IXM5pSbY7Jh+EAHUApELFBklgYVSPD9TqnPt6LSZFTYepfy/fRVn2J086hFQA 17 | AAGWs9ERIgAABAMARjBEAiAkF3zoS6WSPeDHIe5Z7CcB00tYfkSwSNtwk12VzD/r 18 | bAIgZFzd0/7fgfv7xxRFz2YqNDAJ7bgp59qwHF0QFNZ563owCgYIKoZIzj0EAwMD 19 | aQAwZgIxAJoqmHI4kSnKvjcT8iBsSXpvWenOPwXtpl8ya50kFbl7KOgs2iYfoxmv 20 | pJVAvMvl4wIxAIQmsxIi/8hY+YP4ImfPjwHqTjRzyz8of1qIOfcdET27KmCk9exn 21 | TuG0FNIRlJDlHg== 22 | -----END CERTIFICATE----- 23 | 24 | -----BEGIN CERTIFICATE----- 25 | MIIEVzCCAj+gAwIBAgIRALBXPpFzlydw27SHyzpFKzgwDQYJKoZIhvcNAQELBQAw 26 | TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh 27 | cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw 28 | WhcNMjcwMzEyMjM1OTU5WjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg 29 | RW5jcnlwdDELMAkGA1UEAxMCRTYwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATZ8Z5G 30 | h/ghcWCoJuuj+rnq2h25EqfUJtlRFLFhfHWWvyILOR/VvtEKRqotPEoJhC6+QJVV 31 | 6RlAN2Z17TJOdwRJ+HB7wxjnzvdxEP6sdNgA1O1tHHMWMxCcOrLqbGL0vbijgfgw 32 | gfUwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcD 33 | ATASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSTJ0aYA6lRaI6Y1sRCSNsj 34 | v1iU0jAfBgNVHSMEGDAWgBR5tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcB 35 | AQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0g 36 | BAwwCjAIBgZngQwBAgEwJwYDVR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVu 37 | Y3Iub3JnLzANBgkqhkiG9w0BAQsFAAOCAgEAfYt7SiA1sgWGCIpunk46r4AExIRc 38 | MxkKgUhNlrrv1B21hOaXN/5miE+LOTbrcmU/M9yvC6MVY730GNFoL8IhJ8j8vrOL 39 | pMY22OP6baS1k9YMrtDTlwJHoGby04ThTUeBDksS9RiuHvicZqBedQdIF65pZuhp 40 | eDcGBcLiYasQr/EO5gxxtLyTmgsHSOVSBcFOn9lgv7LECPq9i7mfH3mpxgrRKSxH 41 | pOoZ0KXMcB+hHuvlklHntvcI0mMMQ0mhYj6qtMFStkF1RpCG3IPdIwpVCQqu8GV7 42 | s8ubknRzs+3C/Bm19RFOoiPpDkwvyNfvmQ14XkyqqKK5oZ8zhD32kFRQkxa8uZSu 43 | h4aTImFxknu39waBxIRXE4jKxlAmQc4QjFZoq1KmQqQg0J/1JF8RlFvJas1VcjLv 44 | YlvUB2t6npO6oQjB3l+PNf0DpQH7iUx3Wz5AjQCi6L25FjyE06q6BZ/QlmtYdl/8 45 | ZYao4SRqPEs/6cAiF+Qf5zg2UkaWtDphl1LKMuTNLotvsX99HP69V2faNyegodQ0 46 | LyTApr/vT01YPE46vNsDLgK+4cL6TrzC/a4WcmF5SRJ938zrv/duJHLXQIku5v0+ 47 | EwOy59Hdm0PT/Er/84dDV0CSjdR/2XuZM3kpysSKLgD1cKiDA+IRguODCxfO9cyY 48 | Ig46v9mFmBvyH04= 49 | -----END CERTIFICATE----- 50 | -------------------------------------------------------------------------------- /ssl/showcolor.cc/showcolor.cc.key: -------------------------------------------------------------------------------- 1 | -----BEGIN EC PRIVATE KEY----- 2 | MHcCAQEEIFk5OQKzpkbljdC79MjtrYGSLmj2iMJFjSTAZb9I+vbtoAoGCCqGSM49 3 | AwEHoUQDQgAEhXjD2Qlp88CKWQRKf8bpplP3vj0NGNexEOnIt2BIIj7Qvyzr5Hx6 4 | myUpknk8UWD8NxaHKzdIDWt+0f8csT649g== 5 | -----END EC PRIVATE KEY----- 6 | --------------------------------------------------------------------------------