- 証明書の有効期限を確認します。
- 残日数が指定された日数以下の場合には、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 ./...masterへのpushとpull request、および毎週月曜に、GitHub Actionsが次を実行します。
gofmt、go vet、go test -race -cover ./...govulncheckによる脆弱性スキャン- Windows、Linuxそれぞれのamd64、386向けクロスビルド
週次で回すのは、依存が変わらなくても脆弱性データベース側が更新されるためと、 時間の経過で壊れるテストをpushを待たずに検出するためです。
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 のライセンスで配布されている成果物を含んでいます。
- ynozue/apichecker / Copyright (C) 2017 ynozue