JWT トークンを検証しようとしています。コードは OWIN OAuth ハンドラー内にありますが、さまざまな部分を小さなコンソール アプリケーションに取り出したところ、JwtHeader メソッド SigningKeyIdentifier が X509ThumbprintKeyIdentifierClause オブジェクトを作成する方法に問題があるように見えます。
私の JWT には x5t = [base64urlencodedvalue] というヘッダー値があり、この文字列をデコードすると、実際に証明書の拇印であることを確認しました。ただし、SigningKeyIdentifier クラスでは、次のコードは正しくない句を作成しているようです。たとえば、句のハッシュが証明書と一致しません。
identifier.Add(new X509ThumbprintKeyIdentifierClause(Base64UrlEncoder.DecodeBytes(this.GetStandardClaim("x5t"))));
以下は、問題を説明しようとするコンソール アプリのスニペットです。
// http://kjur.github.io/jsjws/tool_b64udec.html
const string X5T = "NmJmOGUxMzZlYjM2ZDRhNTZlYTA1YzdhZTRiOWE0NWI2M2JmOTc1ZA"; // value inside the JWT (x5t)
const string thumbPrint = "6bf8e136eb36d4a56ea05c7ae4b9a45b63bf975d"; // correct thumbprint of certificate
string thumbPrintBase64 = Base64UrlEncoder.Encode(thumbPrint); // <--- value in x5t of JWT
// finds correct certificate
var cert1 = X509CertificateHelper.FindByThumbprint(StoreName.My, StoreLocation.LocalMachine, thumbPrint).First();
var certHash = cert1.GetCertHash();
string hexa = BitConverter.ToString(certHash).Replace("-", string.Empty);
Console.WriteLine(hexa.ToLowerInvariant());
// TokenValidationParameters.IssuerSigningKey
var clause1 = new X509ThumbprintKeyIdentifierClause(cert1);
string hex1 = BitConverter.ToString(clause1.GetX509Thumbprint()).Replace("-", string.Empty);
Console.WriteLine(clause1.ToString());
Console.WriteLine(hex1.ToLowerInvariant());
// this is how JwtHeader.SigningKeyIdentifier method creates SecurityKeyIdentifier
var hash = Base64UrlEncoder.DecodeBytes(thumbPrintBase64);
var clause2 = new X509ThumbprintKeyIdentifierClause(hash); // <----- broken
string hexb = BitConverter.ToString(hash).Replace("-", string.Empty);
Console.WriteLine(hexb.ToLowerInvariant());
Console.WriteLine(clause2.ToString());
string hex2 = BitConverter.ToString(clause2.GetX509Thumbprint()).Replace("-", string.Empty);
Console.WriteLine(hex2.ToLowerInvariant());
// clause1 and clause2 should be the same, but they arent!?
問題は、 X509ThumbprintKeyIdentifierClause のさまざまなコンストラクターが、後で比較すると一致しない異なるハッシュ値になることです。
私の OWIN プロジェクトでは、証明書 (TokenValidationParameters.IssuerSigningKey) から X509ThumbprintKeyIdentifierClause を作成します。例えば
IssuerSigningKey = new X509SecurityKey(X509CertificateHelper.FindByThumbprint(StoreName.My, StoreLocation.LocalMachine, thumbPrint).First()),
そして、x5t フィールドのサムネイルを使用して、JWT を発行証明書と照合するために呼び出される IssuerSigningKeyResolver メソッド。
identifier.Add(new X509ThumbprintKeyIdentifierClause(Base64UrlEncoder.DecodeBytes(this.GetStandardClaim("x5t"))));
しかし、それらは一致しません。
私は何が欠けていますか?サムネイルのエンコード/デコードに何か問題があります。