Я пытаюсь вызвать Apple DeviceCheck API из ASP. NET Core API. Для этого мне нужно создать JWT. Я использую Хосе и BouncyCastle lib для этого. Я попытался создать 2 разных ключа и каждый раз получал статус HTTP 401 (Невозможно проверить токен авторизации) из API-интерфейса разработки DeviceCheck.
private const string MembershipTeamId = "QWERTYUIOP";
private const string P8KeyId = "QWERTYUIOP";
public static string CreateJwt()
{
var extraHeaders = new Dictionary<string, object>()
{
{ "kid", P8KeyId },
{ "typ", "JWT" }
};
var payload = new Dictionary<string, object>()
{
{ "iss", MembershipTeamId },
{ "iat", DateTimeOffset.UtcNow.ToUnixTimeSeconds() }
};
var key = GetCngKey();
return JWT.Encode(payload, key, JwsAlgorithm.ES256, extraHeaders);
}
Ниже 2 разных способов я пытался создать CngKey
// using BouncyCastle
private static CngKey GetCngKey()
{
using (var reader = System.IO.File.OpenText(@"C:\pathto\key.p8"))
{
var param = (ECPrivateKeyParameters)new PemReader(reader).ReadObject();
return EccKey.New(
param.Parameters.G.AffineXCoord.GetEncoded(),
param.Parameters.G.AffineYCoord.GetEncoded(),
param.D.ToByteArrayUnsigned());
}
}
// using CngKey
private static CngKey GetCngKey2()
{
var keyBytes = Convert.FromBase64String("inline .p8 content without -----BEGIN/END PRIVATE KEY-----");
return CngKey.Import(keyBytes, CngKeyBlobFormat.Pkcs8PrivateBlob);
}