C# - 尝试使用导入方法从 .p8 文件创建 CngKey,抛出错误 "An error occurred during encode or decode operation."
C# - Trying to create a CngKey from a .p8 file with import method, throwing error "An error occurred during encode or decode operation."
我正在尝试使用 Jose.JWT.encode(payload, secretKey, JwsAlgorithm.ES256, header)
(请参阅 https://github.com/dvsekhvalnov/jose-jwt)生成 JWT 令牌,以用于 Apple 新的基于令牌的 APNs 系统。
JWT 编码方法要求 secretKey 为 CngKey
格式。
这是我将 .p8 文件从 Apple 转换为 CngKey
对象的代码:
var privateKeyContent = System.IO.File.ReadAllText(authKeyPath);
var privateKey = privateKeyContent.Split('\n')[1];
//convert the private key to CngKey object and generate JWT
var secretKeyFile = Convert.FromBase64String(privateKey);
var secretKey = CngKey.Import(secretKeyFile, CngKeyBlobFormat.Pkcs8PrivateBlob);
然而,在最后一行,抛出以下错误。
System.Security.Cryptography.CryptographicException was unhandled by user code
HResult=-2146885630
Message=An error occurred during encode or decode operation.
Source=System.Core
StackTrace:
at System.Security.Cryptography.NCryptNative.ImportKey(SafeNCryptProviderHandle provider, Byte[] keyBlob, String format)
at System.Security.Cryptography.CngKey.Import(Byte[] keyBlob, String curveName, CngKeyBlobFormat format, CngProvider provider)
at System.Security.Cryptography.CngKey.Import(Byte[] keyBlob, CngKeyBlobFormat format)
at tokenauthapi.App_Start.TokenInitSendMessage.<send>d__0.MoveNext() in C:\token-push-prototype\token-auth-api\token-auth-api\App_Start\TokenInitSendMessage.cs:line 31
InnerException:
输入的格式没有错误,因为有一个单独的错误(当我更改 blob 类型时出现)。
此代码 运行 在 .NET WebApi v4.6 中。
我到处搜索,但无法破译此错误指的是什么。任何帮助将不胜感激。谢谢。
原来我使用的 .p8 文件由于某种原因在中间有换行符。可能是记事本添加了它(并保存了它?)。我按换行符拆分以获得私钥,因此它正在截断密钥。一旦我删除换行符,它就可以正常工作。
如果您遇到 error occurred during encode or decode operation
错误,请检查您的 .p8(或其他)私钥格式是否错误以及长度是否正确。
我遇到了同样的问题。我用这个:
var privateKey = privateKeyContent.Split('\n')[1];
然后我分析从苹果下载的token文件。我发现文件中还有更多 \n
。我不确定这种格式在哪里不同或苹果改变了。
然后我使用以下代码加载令牌,有效。
其实我们可以直接使用这个token字符串。
var privateKeyContent = System.IO.File.ReadAllText(authKeyPath);
var privateKeyList = privateKeyContent.Split('\n');
int upperIndex = privateKeyList.Length;
StringBuilder sb = new StringBuilder();
for(int i= 1; i< upperIndex - 1; i++ )
{
sb.Append(privateKeyList[i]);
Debug.WriteLine(privateKeyList[i]);
}
Apple 为 DeviceCheck 提供的安全密钥 (p8) 也包含换行符。我使用以下方法获取有效的 CngKey:
var privateKeyContent = File.ReadAllText("pathToApplePrivateKey.p8");
var privateKeyList = privateKeyContent.Split('\n').ToList();
var privateKey = privateKeyList.Where((s, i) => i != 0 && i != privateKeyList.Count - 1)
.Aggregate((agg, s) => agg + s);
CngKey key = CngKey.Import(Convert.FromBase64String(privateKey), CngKeyBlobFormat.Pkcs8PrivateBlob);
我正在尝试使用 Jose.JWT.encode(payload, secretKey, JwsAlgorithm.ES256, header)
(请参阅 https://github.com/dvsekhvalnov/jose-jwt)生成 JWT 令牌,以用于 Apple 新的基于令牌的 APNs 系统。
JWT 编码方法要求 secretKey 为 CngKey
格式。
这是我将 .p8 文件从 Apple 转换为 CngKey
对象的代码:
var privateKeyContent = System.IO.File.ReadAllText(authKeyPath);
var privateKey = privateKeyContent.Split('\n')[1];
//convert the private key to CngKey object and generate JWT
var secretKeyFile = Convert.FromBase64String(privateKey);
var secretKey = CngKey.Import(secretKeyFile, CngKeyBlobFormat.Pkcs8PrivateBlob);
然而,在最后一行,抛出以下错误。
System.Security.Cryptography.CryptographicException was unhandled by user code
HResult=-2146885630
Message=An error occurred during encode or decode operation.
Source=System.Core
StackTrace:
at System.Security.Cryptography.NCryptNative.ImportKey(SafeNCryptProviderHandle provider, Byte[] keyBlob, String format)
at System.Security.Cryptography.CngKey.Import(Byte[] keyBlob, String curveName, CngKeyBlobFormat format, CngProvider provider)
at System.Security.Cryptography.CngKey.Import(Byte[] keyBlob, CngKeyBlobFormat format)
at tokenauthapi.App_Start.TokenInitSendMessage.<send>d__0.MoveNext() in C:\token-push-prototype\token-auth-api\token-auth-api\App_Start\TokenInitSendMessage.cs:line 31
InnerException:
输入的格式没有错误,因为有一个单独的错误(当我更改 blob 类型时出现)。
此代码 运行 在 .NET WebApi v4.6 中。
我到处搜索,但无法破译此错误指的是什么。任何帮助将不胜感激。谢谢。
原来我使用的 .p8 文件由于某种原因在中间有换行符。可能是记事本添加了它(并保存了它?)。我按换行符拆分以获得私钥,因此它正在截断密钥。一旦我删除换行符,它就可以正常工作。
如果您遇到 error occurred during encode or decode operation
错误,请检查您的 .p8(或其他)私钥格式是否错误以及长度是否正确。
我遇到了同样的问题。我用这个:
var privateKey = privateKeyContent.Split('\n')[1];
然后我分析从苹果下载的token文件。我发现文件中还有更多 \n
。我不确定这种格式在哪里不同或苹果改变了。
然后我使用以下代码加载令牌,有效。
其实我们可以直接使用这个token字符串。
var privateKeyContent = System.IO.File.ReadAllText(authKeyPath);
var privateKeyList = privateKeyContent.Split('\n');
int upperIndex = privateKeyList.Length;
StringBuilder sb = new StringBuilder();
for(int i= 1; i< upperIndex - 1; i++ )
{
sb.Append(privateKeyList[i]);
Debug.WriteLine(privateKeyList[i]);
}
Apple 为 DeviceCheck 提供的安全密钥 (p8) 也包含换行符。我使用以下方法获取有效的 CngKey:
var privateKeyContent = File.ReadAllText("pathToApplePrivateKey.p8");
var privateKeyList = privateKeyContent.Split('\n').ToList();
var privateKey = privateKeyList.Where((s, i) => i != 0 && i != privateKeyList.Count - 1)
.Aggregate((agg, s) => agg + s);
CngKey key = CngKey.Import(Convert.FromBase64String(privateKey), CngKeyBlobFormat.Pkcs8PrivateBlob);