本文へスキップ
ecdsa.com
ruby-jwt (Ruby)Ruby

エラーメッセージ

Signature verification failed (JWT::VerificationError)

別の表記

  • JWT::VerificationError: Signature verification failed

捕捉されない場合、Ruby は発生場所に続けて「Signature verification failed (JWT::VerificationError)」と出力します。このテキストは ruby-jwt 2.10 と 3.3 で同じです。

ruby-jwt (Ruby) — JWT::VerificationError from JWT.decode

このエラーの意味

ruby-jwt はトークンをデコードし、渡された鍵で署名をチェックしましたが、そのチェックに失敗しました。トークンの形式は正しく、アルゴリズムも許可されています。鍵が署名者のものではないか、トークンが改ざんされています。`JWT::VerificationError` は `JWT::DecodeError` のサブクラスなので、`rescue JWT::DecodeError` は、不正な形式のトークンのエラーと一緒にこのエラーも捕捉します。

発生する理由

修正方法

  1. 1.

    発行者の JWKS から kid で鍵を選択する

    `jwks:` オプションにはローダーを渡せます。トークンが未知の鍵を指定している場合、ruby-jwt は `kid_not_found: true` を付けてローダーを再度呼び出すため、ローテーションが反映されます。

    ruby
    require "jwt"
    require "net/http"
    
    jwks_loader = ->(options) do
      @jwks = nil if options[:kid_not_found] && @jwks_loaded_at.to_i < Time.now.to_i - 300 # refetch on rotation
      @jwks ||= begin
        @jwks_loaded_at = Time.now.to_i
        JSON.parse(Net::HTTP.get(URI("https://issuer.example.com/.well-known/jwks.json")))
      end
    end
    
    payload, header = JWT.decode(token, nil, true, algorithms: ["ES256"], jwks: jwks_loader,
                                 iss: "https://issuer.example.com/", verify_iss: true)
  2. 2.

    鍵が一致することを確かめる

    双方の公開鍵のハッシュが一致すれば、鍵は原因から除外できます。その場合は、転送中にトークンが変更されていないかを調べてください。

    bash
    openssl pkey -in issuer-private.pem -pubout | sha256sum
    openssl pkey -pubin -in configured-public.pem | sha256sum   # must be identical

関連するエラー

署名エラーデータベースをすべて見る