web-dev-qa-db-ja.com

RS256 PIIを使用するJWT SecurityTokenInvalidSignatureExceptionは非表示です

助けてください! MicrosoftのSystem.IdentityModel.Tokens.Jwtライブラリを使用してRS256で署名されたJWTトークンの検証に問題があります。

このトークンは、 JWT.io で正常に検証されます。

これはエラーです:

Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException IDX10503:署名の検証に失敗しました。試したキー:「[PII is hidden]」。キャッチされた例外: '[PII is hidden]'。トークン:「[PII is hidden]」。

これはサンプルコードです(System.IdentityModel.Tokens.Jwt v5.2.2 NuGetパッケージでLinqPadを使用しました)

void Main()
{
    var cText =
        "-----BEGIN CERTIFICATE-----\n" +
        "MIIBljCCAUACCQCIDMpqK7WfWDANBgkqhkiG9w0BAQsFADBSMQswCQYDVQQGEwJV\n" + 
        "UzETMBEGA1UECAwKU29tZS1TdGF0ZTESMBAGA1UECgwJTHV4b3R0aWNhMRowGAYD\n" +
        "VQQLDBFMdXhvdHRpY2EgZXllY2FyZTAeFw0xODA1MjMxNTE1MjdaFw0yODA1MjAx\n" +
        "NTE1MjdaMFIxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApTb21lLVN0YXRlMRIwEAYD\n" +
        "VQQKDAlMdXhvdHRpY2ExGjAYBgNVBAsMEUx1eG90dGljYSBleWVjYXJlMFwwDQYJ\n" +
        "KoZIhvcNAQEBBQADSwAwSAJBAKuMYcirPj81WBtMituJJenF0CG/HYLcAUOtWKl1\n" +
        "HchC0dM8VRRBI/HV+nZcweXzpjhX8ySa9s7kJneP0cuJiU8CAwEAATANBgkqhkiG\n" +
        "9w0BAQsFAANBAKEM8wQwlqKgkfqnNFcbsZM0RUxS+eWR9LvycGuMN7aL9M6GOmfp\n" +
        "QmF4MH4uvkaiZenqCkhDkyi4Cy81tz453tQ=\n" +
        "-----END CERTIFICATE-----";

    var c = new X509Certificate2(Encoding.ASCII.GetBytes(cText));
    var p = new TokenValidationParameters();
    p.IssuerSigningKeyResolver = (s, securityToken, identifier, parameters)
        => new[] { new X509SecurityKey(c) };
    var h = new JwtSecurityTokenHandler();
    var token = @"eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJuLmNoaWVmZm8iLCJleHAiOjE1MjcyMzg4ODEsImlzcyI6Imx1eCJ9.BAaYzLwokmdKqLi6zKjGIpDXd__dZxi5PUWWHS3PSLPDYAInzPbEK8o4WxunoGD7eA0qtQNaxNpzeOc3BHrd4w";
    h.ValidateToken(token, p, out SecurityToken _);
}

最後に、[PII is hidden]を削除する方法も知っておくといいでしょう。エラーの詳細を確認できます。 app.configまたはmachine.configファイルでenableLoggingKnownPiiとlogKnownPIIをtrueに設定しても違いはないようです。

12
Carlo Bos

X509SecurityKeyのKeySizeは、検証のために少なくとも1024の長さが必要であることがわかります。 [PII is hidden]フィルターで非表示になるため、これは例外から明らかではありません。

次の行を追加すると、例外テキストがさらに便利になりました。

IdentityModelEventSource.ShowPII = true;

新しい例外テキスト:

'System.ArgumentOutOfRangeException:IDX10631:検証用の' Microsoft.IdentityModel.Tokens.X509SecurityKey 'を' 1024 'ビットより小さくすることはできません。 KeySize: '512'。

非対称キーの長さを1024に増やすと、問題が解決しました。

29
Carlo Bos