2017-02-28 206 views
11

我试图使用基于标记的身份验证向iOS设备发送推送通知。如何在C#中使用APN验证密钥(.p8文件)?

根据需要,我在Apple的Dev Portal中生成了APN认证密钥,并下载了它(它是一个带有p8扩展名的文件)。

要从我的C#服务器发送推送通知,我需要以某种方式使用此p8文件签署我的JWT令牌。我怎么做?

我试图加载文件到X509Certificate2,但X509Certificate2似乎并不接受p8文件,所以然后我试图将文件转换为pfx/p12,但无法找到一种方法来实现这一功能。

回答

4

我找到了一种方法来做到这一点,利用BouncyCastle

private static CngKey GetPrivateKey() 
{ 
    using (var reader = File.OpenText("path/to/apns/auth/key/file.p8")) 
    { 
     var ecPrivateKeyParameters = (ECPrivateKeyParameters)new PemReader(reader).ReadObject(); 
     var x = ecPrivateKeyParameters.Parameters.G.AffineXCoord.GetEncoded(); 
     var y = ecPrivateKeyParameters.Parameters.G.AffineYCoord.GetEncoded(); 
     var d = ecPrivateKeyParameters.D.ToByteArrayUnsigned(); 
     return EccKey.New(x, y, d); 
    } 
} 

现在创建和签署令牌(使用jose-jwt):

private static string GetProviderToken() 
{ 
    var epochNow = (int) DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds; 
    var payload = new Dictionary<string, object>() 
    { 
     {"iss", "your team id"}, 
     {"iat", epochNow} 
    }; 
    var extraHeaders = new Dictionary<string, object>() 
    { 
     {"kid", "your key id"} 
    }; 
    var privateKey = GetPrivateKey(); 
    return JWT.Encode(payload, privateKey, JwsAlgorithm.ES256, extraHeaders); 
} 
+1

你愿意分享你的代码,你用于上传令牌和有效载荷数据?我尝试了几个小时,但只得到“连接关闭”错误。 –

+0

嗨,我该如何使用此令牌调用Apple Web服务? –

相关问题