2026 OpenClaw Webhook 受信実務:Mac VPS での署名検証・リプレイ防止・冪等検収チェックリスト(FAQ)

OpenClaw を Mac VPS に常駐させたあとも、チケットや決済、社内承認は構造化 JSON を HTTP で押し込みたい場面が残ります。IM 公式コネクタだけでは主キー設計と噛み合わず、自作 Webhook にすると HMAC の生バイト一致、時刻窓、指数バックオフ付き再送、ゲートウェイ JSONL との相関を自分で揃える必要があります。本稿はプラットフォーム/SRE 向けに痛み分け、HTTP と IM の意思決定表、TLS・リバプロ前提、ヘッダ設計表、五段階ロールアウト、三つの運用指標、層別切り分けと既存記事リンク、FAQ までを一連の Runbook にまとめます。多チャネル運用は 検収記事、ゲートウェイは doctor ガイド を参照してください。

Mac VPS 上の OpenClaw ゲートウェイへ安全な Webhook HTTP を届けるイメージ

目次

1. 痛み分け:署名ドリフト・リプレイ・冪等の穴

Webhook は信頼の根をベンダ OAuth から自前 HTTP に移します。ペイロードは整いますが、正規化・時計・重複排除・観測は自前です。

  1. 署名ドリフト:API ゲートが JSON を再整形すると署名側と検証側のバイト列が一致せず断続 401 になります。
  2. 時刻とリプレイ:署名だけではキャプチャ再送が通ります。窓が狭すぎるとリージョン跨ぎのスキューで正常再送も落ちます。
  3. 冪等の欠落:決済やチケットは指数バックオフ再送が前提です。event_id の短期ストアが無いと危険ツールが二重発火します。
  4. 観測の断線:requestId を JSONL に載せないと openclaw doctor 結果と結べず原因が散ります。

2. 意思決定表:HTTP Webhook とネイティブ IM

ヒューマンループが Feishu/Telegram に既にあるなら マルチチャネル Runbook を先に。ERP/決済/マイクロサービス発なら HTTP が短いです。

観点 HTTP Webhook ネイティブ IM
信頼根 自前 HMAC または mTLS、鍵バージョン明示 プラットフォーム OAuth/Bot トークン
冪等と再送 ストアと再送嵐メトリクスが必須 重複も起きるがチャット意味論に沿う
トポロジ 固定グローバル IP・証明書・パス設計が要る 主に外向き長接続、家庭用 NAT には不向き
典型用途 チケット状態、決済結果、CI 結果プッシュ メンション付き会話、サポート補助

3. Mac VPS 前提:TLS・リバプロ・ポート

Nginx や Caddy で TLS を終端し、ループバックの sidecar へ転送します。寛い CORS と広い時刻窓を素の公開リスナに出さないでください。文書上のゲートウェイポートは 18789、コンテナ管理面は 3000 など混在しがちなので外向き path と upstream を変更票に固定し、アップグレード後に再測定し doctor 記事 と突き合わせます。証明書は自動更新とフルチェーンをリバプロ層に。追加で Docker トークン Runbookワンクリック導入の手引き を読み、CLI とデーモンの環境変数を揃えます。

4. HMAC と時刻窓:パラメータ表

ヘッダ名はチームで差し替え可ですが「生 body 一致」と「時刻窓」は削れません。

項目 推奨値 メモ
X-Webhook-Timestamp Unix 秒またはミリ秒 検証済みサーバ時刻との差が窓内か
X-Webhook-Signature v1=<hmac_hex> ローテ中に複数秘密を並行検証するための接頭辞
X-Webhook-Id ULID など一意イベント ID 冪等キー。TTL はベンダ再送上限+余白
窓幅 初期 ±300 秒など NTP と地域 RTT を見てから締める
# ローカル検証のみ。秘密をリポジトリに置かない
TS=$(date +%s)
BODY='{"type":"ticket.updated","id":"01JVM0EXAMPLE"}'
SIG=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "$WEBHOOK_SECRET" | awk '{print $2}')
curl -sS -X POST "https://your-mac-vps.example/hooks/openclaw" \
-H "Content-Type: application/json" \
-H "X-Webhook-Timestamp: $TS" \
-H "X-Webhook-Signature: v1=$SIG" \
-H "X-Webhook-Id: 01JVM0EXAMPLE" \
-d "$BODY"

5. 五段階:鍵ローテから curl プローブまで

  1. URL 固定:DNS・証明書・パスを同じ変更票に載せ、連携中に path を変えない。
  2. 版付き検証v1 で材料選択。旧秘密は検証のみで窓が閉じるまで残す。
  3. 冪等ストア:Redis や SQLite に TTL。ヒット率をメトリクス化して黙殺を防ぐ。
  4. 観測整列:合法 Webhook 後に webhookId と gatewaySession を JSONL へ。
  5. 五プローブ:正常、期限切れ時刻、誤署名、重複 Id、巨大 body。HTTP コードとログ行を添付資料に。

6. 三つの運用指標

本番宣言前に三カウンタを仕込み、支払い事故の夜にログ尾だけを見ない運用へ。

7. 層別切り分けと内部リンク

200 なのにエージェントが動かないときは chunked 改変→アプリキュー詰まり→ゲートウェイのツール拒否→モデル 429 の順で、各層で同一 requestId に戻れるかを確認します。ノート PC常駐や家庭回線は固定出口とスリープ方針が弱く TLS 曲線と再送統計が悪化し、監査で求められる「どの鍵でどのコールバックを誰が検証したか」の証跡が途切れがちです。Docker は柔軟ですがボリューム権限とネットワーク抽象が一段増え、インシデントが長引きます。7×24 で OpenClaw と監査付き HTTP 入站を両立するチームには、VPSMAC の Apple Silicon Mac クラウドで時計・帯域・SSH 運用を一本化し、リバプロ・署名・JSONL を同一 Runbook に載せる方が、縁の下の端末にルールを積むより本質に近いことが多いです。

8. FAQ

401 最初に? 署名バイト列一致、その後タイムスタンプと v1 接頭辞。

IM と HTTP 併用? 冪等接頭辞を分け同時到達を前提にゲートウェイで統一去重。

企業プロキシ? launchd と Compose の HTTPS_PROXY/NO_PROXY を揃え同一文脈で curl。

9. まとめ

成功は HTTP 200 ではなく署名・冪等・JSONL を一つの証拠鎖にできるかです。五段階と三指標をテンプレに入れ、重複 Id をページングへ、四半期ごとに鍵ローテ演習を回してください。