Jenkins CLI:「CLI handshake failed with status code 403」
CLI は既定で WebSocket で接続します。2026年3月のセキュリティ修正から、Jenkins はその接続を Jenkins URL に設定した住所からしか受け付けません。Jenkins URL が未設定か、-s で別の名前でサーバーを指すと、接続の最初のやり取り(ハンドシェイク)が 403 になります。Jenkins URL を設定してその住所をそのまま使うか、-http を付けます。
答えの全体
2026年10月24日に、Jenkins URL を設定していない Jenkins 2.580.1 へ、API トークンでサインインして jenkins-cli.jar 2.580.1 を動かしたときの表示(終了コード 15)。1行目の後に応答の見出しが並び、理由はこの行にあります:
java -jar jenkins-cli.jar -s http://127.0.0.1:8091/ -auth @auth.txt who-am-i CLI handshake failed with status code 403 X-CLI-Error: Jenkins URL is not configured (set Jenkins URL in the configuration)
Jenkins URL を設定したうえで、同じサーバーを別の名前で指すと、2つ目の理由になりました。Jenkins URL が http://127.0.0.1:8091/ で -s http://localhost:8091/、またはその逆:
CLI handshake failed with status code 403 X-CLI-Error: Unexpected request origin (check your reverse proxy settings)
起き始めた理由
2026年3月18日の Jenkins のセキュリティ勧告(SECURITY-3674・WebSocket の CLI の接続元の確認にあった DNS リバインディングの問題)で、確認のしかたが変わりました。Jenkins は接続元を、リクエスト自身の Host や X-Forwarded-Host ではなく、Jenkins の管理 → システムで設定した Jenkins URL と比べるようになり、Jenkins URL が未設定なら接続を断ります。直ったのは Jenkins 2.555 と LTS 2.541.3 です。サーバー上で -s http://localhost:8080/ を使っていたスクリプトや、プロキシが書き換えるホスト名で動いていたスクリプトは、それまで通っていて、この版から 403 になります。
直し方
- Jenkins URL を設定する:Jenkins の管理 → システム → Jenkins URL。
-sにはその住所をそのまま渡します(スキーム・ホスト名・ポートまで同じ)。http://127.0.0.1:8091/を設定すると、同じコマンドがAuthenticated as: testerと答えました。 - または
-httpを付ける:CLI は WebSocket ではなく普通の HTTP のリクエストを2本使い、この確認は掛かりません。Jenkins URL を別のホスト名にしたままでも、-httpなら接続できました:java -jar jenkins-cli.jar -s http://127.0.0.1:8091/ -http -auth @auth.txt who-am-i
- 勧告には、修正で問題が出たとき用に、前のヘッダーで比べる確認へ戻すシステム プロパティ
hudson.cli.CLIAction.ACCEPT_URL_FROM_REQUEST=trueも書かれています。修正で塞いだ弱点も戻るので、私たちは試していません。
401 なら原因はトークンです。-http で間違ったトークンを渡すと、java.io.IOException: Server returned HTTP response code: 401 for URL: …/cli?remoting=false で終わりました。「anonymous is missing the Overall/Read permission」なら、トークンが Jenkins に届いていません(送り方)。
CLI を使わずに IntelliJ IDEA で Jenkins のビルドを見るなら
Pipeline Inbox for Jenkins は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。CLI ではなく Jenkins の REST API に、ユーザー ID と API トークンを付けて普通の HTTP(S) で話すので、この WebSocket の確認には掛かりません。ビルドの一覧・Pipeline の段・失敗したテスト・コンソールのログは無料、パラメーター付きのビルド・再ビルド・中止・入力ステップは Pro(月 US$1.50・30日間の無料試用つき)です。画面は日本語です。
Jenkins® は LF Charities Inc. の登録商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは Jenkins プロジェクト・JetBrains のいずれとも提携しておらず、承認も受けていません。