Я столкнулся с проблемой, которая беспокоила меня долгое время, и нашел много информации, но большая ее часть только на Java и PHP. Я пытался написать соответствующий код C# на основе кода Java и PHP, но похоже, что в C# нет аналогичного API. Эта задача выходит за рамки моих возможностей.
Требования
Я разрабатываю приложение для iOS, которое необходимо интегрировать с Apple In-App Purchase (IAP). ) система. После того, как пользователь успешно совершает покупку, сервер Apple генерирует обратный вызов и отправляет мне строку информации, которую мне нужно проверить на подлинность. Но я не знаю, как это сделать. (Хотя я хотел бы поделиться содержимым этого JWS, оно содержит конфиденциальную информацию и не может быть раскрыто публично.)
Текущий прогресс
Проверка информации обратного вызова:
Информация, отправляемая в обратном вызове, представляет собой строку JSON, где полезная нагрузка — JWS. Этот JWS можно проверить непосредственно на https://jwt.io, подтвердив, что JWS действителен и может самостоятельно проверяться.
Проверка цепочки сертификатов:
Я могу использовать класс X509Chain для проверки сертификата цепочка в части x5c JWS. Вот мой код проверки:
// AppleRootCA-G3.cer is downloaded from apple.com manually
var AppleRootCA = new X509Certificate2("AppleRootCA-G3.cer");
var handler = new JwtSecurityTokenHandler();
var jsonToken = handler.ReadToken(dto.signedPayload) as JwtSecurityToken; // dto is the json that the apple sent to me, dto.signedPayload is a jws.
var itor = jsonToken.Header["x5c"] as IReadOnlyList;
// certificate2.Thumbprint is same as AppleRootCA.Thumbprint
X509Certificate2 certificate2 = new X509Certificate2(Convert.FromBase64String((string)itor[2]));
X509Certificate2 certificate1 = new X509Certificate2(Convert.FromBase64String((string)itor[1]));
X509Certificate2 certificate0 = new X509Certificate2(Convert.FromBase64String((string)itor[0]));
// I have trusted the AppleRootCA-G3.cer before, so I don't need to call them again.
// X509Store store = new X509Store(StoreName.Root, StoreLocation.CurrentUser);
// store.Open(OpenFlags.ReadWrite);
// store.Add(AppleRootCA);
using var chain = new X509Chain();
// chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;
// chain.ChainPolicy.VerificationFlags = X509VerificationFlags.AllowUnknownCertificateAuthority;
chain.ChainPolicy.ExtraStore.Add(certificate2);
chain.ChainPolicy.ExtraStore.Add(certificate1);
chain.ChainPolicy.ExtraStore.Add(certificate0);
var isValid = chain.Build(AppleRootCA);
Console.WriteLine(isValid); // true
Попытка проверки токена:
Я попытался использовать следующий код для проверки токена:
IDX10517: Signature validation failed. The token's kid is missing. Keys tried: 'Microsoft.IdentityModel.Tokens.X509SecurityKey, KeyId: 'B52CB02FD567E0359FE8FA4D4C41037970FE01B0', InternalId: 'tSywL9Vn4DWf6PpNTEEDeXD-AbA'. , KeyId: B52CB02FD567E0359FE8FA4D4C41037970FE01B0
'. Number of keys in TokenValidationParameters: '1'.
Number of keys in Configuration: '0'.
Exceptions caught:
'[PII of type 'System.Text.StringBuilder' is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'.
token: '[PII of type 'System.IdentityModel.Tokens.Jwt.JwtSecurityToken' is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'. See https://aka.ms/IDX10503 for details.
ChatGPT предложил мне передать правильный IssuerSigningKey. Я попытался изменить входной параметр AppleRootCA на certificate0, certificate1 и certificate2, но та же ошибка не исчезла. В настоящее время я в растерянности и не знаю, как убедиться, что этот JWS действителен. Мне очень хочется получить помощь!
Некоторая информация может оказаться полезной :AppleRootCA-G3.cer загружается с сайта apple.com/certificateauthority/AppleRootCA-G3.cer
Я столкнулся с проблемой, которая беспокоила меня долгое время, и нашел много информации, но большая ее часть только на Java и PHP. Я пытался написать соответствующий код C# на основе кода Java и PHP, но похоже, что в C# нет аналогичного API. Эта задача выходит за рамки моих возможностей. Требования Я разрабатываю приложение для iOS, которое необходимо интегрировать с Apple In-App Purchase (IAP). ) система. После того, как пользователь успешно совершает покупку, сервер Apple генерирует обратный вызов и отправляет мне строку информации, которую мне нужно проверить на подлинность. Но я не знаю, как это сделать. (Хотя я хотел бы поделиться содержимым этого JWS, оно содержит конфиденциальную информацию и не может быть раскрыто публично.) Текущий прогресс [list] [*][b]Проверка информации обратного вызова[/b]: [list] Информация, отправляемая в обратном вызове, представляет собой строку JSON, где полезная нагрузка — JWS. Этот JWS можно проверить непосредственно на https://jwt.io, подтвердив, что JWS действителен и может самостоятельно проверяться. [/list]
[*][b]Проверка цепочки сертификатов[/b]: [list] Я могу использовать класс X509Chain для проверки сертификата цепочка в части x5c JWS. Вот мой код проверки: [/list] [code]// AppleRootCA-G3.cer is downloaded from apple.com manually var AppleRootCA = new X509Certificate2("AppleRootCA-G3.cer"); var handler = new JwtSecurityTokenHandler(); var jsonToken = handler.ReadToken(dto.signedPayload) as JwtSecurityToken; // dto is the json that the apple sent to me, dto.signedPayload is a jws. var itor = jsonToken.Header["x5c"] as IReadOnlyList;
// certificate2.Thumbprint is same as AppleRootCA.Thumbprint X509Certificate2 certificate2 = new X509Certificate2(Convert.FromBase64String((string)itor[2])); X509Certificate2 certificate1 = new X509Certificate2(Convert.FromBase64String((string)itor[1])); X509Certificate2 certificate0 = new X509Certificate2(Convert.FromBase64String((string)itor[0]));
// I have trusted the AppleRootCA-G3.cer before, so I don't need to call them again. // X509Store store = new X509Store(StoreName.Root, StoreLocation.CurrentUser); // store.Open(OpenFlags.ReadWrite); // store.Add(AppleRootCA);
using var chain = new X509Chain(); // chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; // chain.ChainPolicy.VerificationFlags = X509VerificationFlags.AllowUnknownCertificateAuthority; chain.ChainPolicy.ExtraStore.Add(certificate2); chain.ChainPolicy.ExtraStore.Add(certificate1); chain.ChainPolicy.ExtraStore.Add(certificate0); var isValid = chain.Build(AppleRootCA); Console.WriteLine(isValid); // true [/code]
[*][b]Попытка проверки токена[/b]: [list] Я попытался использовать следующий код для проверки токена: [/list] [code]var validationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new X509SecurityKey(AppleRootCA), ValidateIssuer = false, ValidateAudience = false, // RequireExpirationTime = true, ValidateLifetime = true, // TryAllIssuerSigningKeys = true }; try { handler.ValidateToken(dto.signedPayload, validationParameters, out var st); // await handler.ValidateTokenAsync(jsonToken, validationParameters); Console.WriteLine("success"); // return true; } catch (Exception ex) { Console.WriteLine($"false: {ex.Message}"); // return false; } [/code] [list] [*]Однако я постоянно сталкиваюсь со следующей ошибкой: [/list] [code]IDX10517: Signature validation failed. The token's kid is missing. Keys tried: 'Microsoft.IdentityModel.Tokens.X509SecurityKey, KeyId: 'B52CB02FD567E0359FE8FA4D4C41037970FE01B0', InternalId: 'tSywL9Vn4DWf6PpNTEEDeXD-AbA'. , KeyId: B52CB02FD567E0359FE8FA4D4C41037970FE01B0 '. Number of keys in TokenValidationParameters: '1'. Number of keys in Configuration: '0'. Exceptions caught: '[PII of type 'System.Text.StringBuilder' is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'. token: '[PII of type 'System.IdentityModel.Tokens.Jwt.JwtSecurityToken' is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'. See https://aka.ms/IDX10503 for details. [/code] [list] [*]ChatGPT предложил мне передать правильный IssuerSigningKey. Я попытался изменить входной параметр AppleRootCA на certificate0, certificate1 и certificate2, но та же ошибка не исчезла. В настоящее время я в растерянности и не знаю, как убедиться, что этот JWS действителен. Мне очень хочется получить помощь! [/list]
[/list] Некоторая информация может оказаться полезной :AppleRootCA-G3.cer загружается с сайта apple.com/certificateauthority/AppleRootCA-G3.cer