Skip to content
223nPublic

About

Check deadline of certificate

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Repository files navigation

certcheck

GitHub CI

なにするもの?

  1. 証明書の有効期限を確認します。
  2. 残日数が指定された日数以下の場合には、Slackに通知します。

使い方

インストール

releasesから、実行ファイルを ダウンロードします。

配布している実行ファイルにコード署名は行っていません。

設定ファイルの作成

ダウンロードした実行ファイルと同じディレクトリに、設定ファイルを作成、 配置します。

起動

実行ファイルを起動します。

実行ログには、実行結果が出力されます。

また、残日数が指定日数より少ない場合には、Slackに通知されます。

certcheck
certcheck -c="config.yml"

引数

引数名 説明 例
c 設定ファイルを指定できます。 certcheck -c="config.yml"
v バージョン情報を出力します。 certcheck -v

設定ファイル

certcheck.yml.formatを参考に、certcheck.yml ファイルを作成してください。

なお、targetsでSlackの設定(hook_url、channel、username、icon)を 指定した場合は、slackの設定を上書きします。

フォーマット

targets:
  - name:       (分かりやすい名称)
    endpoint:   (調べるURL)
    threshold:  (Slackに通知する残日数)
    hook_url:   (SlackのIncoming Webhooksで発行したWebhook URL / 上書き項目)
    channel:    (Slackの通知で投稿するチャンネル / 上書き項目)
    username:   (Slackの通知で表示するユーザー名 / 上書き項目)
    icon:       (Slackの通知で表示するアイコン / 上書き項目)
slack:
  hook_url:     (SlackのIncoming Webhooksで発行したWebhook URL)
  channel:      (Slackの通知で投稿するチャンネル)
  username:     (Slackの通知で表示するユーザー名)
  icon:         (Slackの通知で表示するアイコン)

設定項目

項目 必須 説明
targets[].name ○ 分かりやすい名称。ログの識別に使用します。
targets[].endpoint ○ 調べるURL。http://を指定するとエラーになります。
targets[].threshold Slackに通知する残日数。既定値は0です。
targets[].hook_url slack.hook_urlを上書きします。
targets[].channel slack.channelを上書きします。
targets[].username slack.usernameを上書きします。
targets[].icon slack.iconを上書きします。
slack.hook_url ○ Incoming Webhooksで発行したWebhook URL。
slack.channel 通知を投稿するチャンネル。
slack.username 通知で表示するユーザー名。
slack.icon 通知で表示するアイコン。例: :lock:

動作仕様

通知の条件

残日数がthreshold以下になったときに、Slackへ通知します。 残日数は時間の端数を切り捨てた値なので、既定値の0では期限切れの当日、残り24時間を切った時点から通知されます。

エンドポイントへ接続できなかった場合も、NG:で始まるメッセージを通知します。

残日数に余裕がある場合は、ログに出力するだけで通知はしません。

出力するメッセージは、次の3種類です。

Cert OK: https://example.com expire: 2026/11/02 17:39 at 61 days
Cert Warning: https://example.com expire: 2026/11/02 17:39 at 5 days
NG: request "https://example.com": dial tcp: connection refused

有効期限は、日本標準時(UTC+9)で表示します。

エラー時のふるまい

1つのターゲットで問題が起きても、残りのターゲットの確認は続きます。

状況 ふるまい
設定ファイルを読み込めない エラーを出力して終了します。
nameやendpointが空 そのターゲットを読み飛ばします。
エンドポイントへ接続できない NG:を通知して次へ進みます。
Slackへの通知に失敗した エラーを出力して次へ進みます。

タイムアウト

1つのエンドポイントへの接続とTLSハンドシェイクは、10秒で打ち切ります。

Slackへの通知も同じく10秒で打ち切ります。

終了コード

終了コード 意味
0 正常終了。ターゲット個別の失敗はここに含みます。
1 設定ファイルの読み込みまたは引数の解析に失敗しました。

開発

必要なもの

Go 1.26以降が必要です。

ディレクトリ構成

main.go                  コマンドの入り口。引数の解析と組み立てを行う
internal/config/         設定ファイルの読み込み、検証、上書きの解決
internal/checker/        証明書の取得と残日数の判定
internal/notify/         通知先への配送(Slack Incoming Webhooks)
internal/runner/         ターゲットごとの処理順序の制御
docs/ARCHITECTURE.md     設計の意図と依存関係の説明

設計の詳細はdocs/ARCHITECTURE.mdを参照してください。

ビルド

go build .

テスト

go test -race -cover ./...

外部のネットワークへは接続しません。証明書の検証は、テスト内で発行した 使い捨ての証明書をhttptestのTLSサーバーに載せて確認します。

静的解析

gofmt -l .
go vet ./...

CI

masterへのpushとpull request、および毎週月曜に、GitHub Actionsが次を実行します。

  1. gofmt、go vet、go test -race -cover ./...
  2. govulncheckによる脆弱性スキャン
  3. Windows、Linuxそれぞれのamd64、386向けクロスビルド

週次で回すのは、依存が変わらなくても脆弱性データベース側が更新されるためと、 時間の経過で壊れるテストをpushを待たずに検出するためです。

Go 1.26への引き上げに伴うTLSの挙動変更

go.modのGoディレクティブは、ビルド結果に焼き込まれるGODEBUGの既定値を 決めます。1.24から1.26に上げたことで、TLSクライアントとしての挙動が3点 変わります。certcheckはTLSハンドシェイクだけを行うツールなので、いずれも 監視結果に直接影響します。

設定 1.24 1.26 影響
tlssha1 1 0 TLS 1.2でSHA-1署名を拒否する(Go 1.25、RFC 9155)
tlssecpmlkem 0 1 耐量子鍵交換X25519MLKEM768を既定で提示する(Go 1.24)
urlstrictcolons 0 1 URLのコロンの解釈が厳しくなる(Go 1.26)

前2者に該当する古いエンドポイントは、残日数ではなくハンドシェイク失敗として NGで通知されます。とくにtlssecpmlkemは、大きくなったClientHelloを扱えない 中間機器がある場合に効きます。

監視対象にそうした機器がある場合は、main.goに次の行を置くと個別に従来の 挙動へ戻せます。

//go:debug tlssha1=1
//go:debug tlssecpmlkem=0

上記の既定値はdebug.ReadBuildInfo()のDefaultGODEBUGを両バージョンで ビルドして実測したものです。

リリース

GitHubのActionsタブからReleaseワークフローを手動実行し、versionに タグ名(例: v1.3.0)を指定します。

テスト(go vet、go test -race -cover、govulncheck)を通ったときだけ、 タグの作成、リリースノートの生成、実行ファイルとSHA256SUMSの添付まで自動で 行います。

入力 説明
version タグ名。v1.2.3またはv1.2.3-rc1の形式のみ受け付けます。
prerelease pre-releaseとして公開するかどうか。既定値はfalseです。

ライセンス

このソースのライセンスは、LICENSEを参照してください。

その他

このソースの一部は、Apache License, Version 2.0 のライセンスで配布されている成果物を含んでいます。

About

Check deadline of certificate

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages