白嫖的3个月免费证书虽好,奈何时间太短,容易忘记更新,这不就有网友来提醒了 Meekdai/Gmeek#274 。之前记得阿里云有邮件提醒的,最近突然没有提醒了,然后发现域名监控发邮件功能居然收费了24元,无奈只好自己再想想法子了。

作为一名不完全合格的Github邪修,当然是要在Github上开发这个功能了。因为ChatGPT日益强大,所以这种简单功能的代码完全交给它就行。

name: SSL Certificate Expiry

on:
  schedule:
    - cron: "0 16 * * *"
  workflow_dispatch: # 允许手动触发

jobs:
  check-ssl-cert:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repo
        uses: actions/checkout@v4

      - name: Check SSL expiry
        id: ssl
        run: |
          DOMAIN="meekdai.com"
          EXPIRY_DATE=$(echo | openssl s_client -servername $DOMAIN -connect $DOMAIN:443 2>/dev/null \
            | openssl x509 -noout -enddate | cut -d= -f2)
          EXPIRY_TS=$(date -d "$EXPIRY_DATE" +%s)
          NOW_TS=$(date +%s)
          REMAINING_DAYS=$(( (EXPIRY_TS - NOW_TS) / 86400 ))

          if [ "$REMAINING_DAYS" -lt 7 ]; then
            STATUS="⚠️ meekdai.com 证书将在 $REMAINING_DAYS 天内过期!"
            echo "exit_needed=true" >> $GITHUB_OUTPUT
          else
            STATUS="✅ meekdai.com 证书正常,剩余 $REMAINING_DAYS 天"
            echo "exit_needed=false" >> $GITHUB_OUTPUT
          fi

          echo "status=$STATUS" >> $GITHUB_OUTPUT

      - name: Overwrite README.md with status
        run: |
          echo "${{ steps.ssl.outputs.status }}" > README.md

      - name: Commit and push if changed
        run: |
          git config user.name github-actions
          git config user.email github-actions@github.com

          if [[ `git status --porcelain` ]]; then
            git add README.md
            git commit -m "更新 SSL 证书状态"
            git push
          else
            echo "README 无变化,无需提交"
          fi

      - name: Fail if cert expires soon
        if: ${{ steps.ssl.outputs.exit_needed == 'true' }}
        run: |
          echo "❌ meekdai.com SSL 证书将在 ${{ steps.ssl.outputs.status }} 过期,触发失败"
          exit 1

巧妙的是这里利用了GitHub Action运行失败会自动给GitHub绑定的邮箱发送邮件的功能,所以不需要自己在添加邮件发送功能,或者是其他的webhook功能。

有道是越简单越强大,设置了每天运行一次Action,如果域名证书的时间大于7天,则不报错,更新readme文档中的时间即可;如果域名证书的时间小于7天了,更新readme文档中的时间,然后报错,触发GitHub发送邮件。

这样我就简单的实现了我所需要的全部功能,后续如果要添加多个域名证书检测也是很简单的,哈哈。然后根据习惯,我把这个项目命名为GSSL

❤️ 转载文章请注明出处,谢谢!❤️