CngKey.Import on azure

时间:2016-12-15 13:23:52

标签: c# .net azure .net-core private-key

var rawData = Convert.FromBase64String(_signingKey);
var cng = CngKey.Import(rawData, CngKeyBlobFormat.Pkcs8PrivateBlob);

我使用此代码从嵌入式base64字符串中提取密钥。 当我在本地测试时它工作正常,但是当我在azure上发布时,我得到以下异常:

WindowsCryptographicException: The system cannot find the file specified

(我再一次不读取任何文件) 我需要这个与苹果apns通信推送通知,有任何解决方法吗? 这种情况只发生在免费服务计划上,如果我切换到基本计划它正在工作。

4 个答案:

答案 0 :(得分:2)

将现有应用程序发布到Azure后,我遇到了同样的错误。在我的情况下,我在App Services / App Name / Application Settings中设置WEBSITE_LOAD_USER_PROFILE = 1后问题得以解决。

答案 1 :(得分:1)

它似乎是因为您的Azure移动应用中没有附加证书。如果是这种情况,我们需要将"Development" or "Distribution" SSL certificate上传到WebApp。有关如何向iOS App发送推送通知的更多信息,请参阅azure document

enter image description here

答案 2 :(得分:1)

我尝试从字节数组构建X509Certificate2时出现了类似的错误 - 在本地工作正常但是一旦部署到Azure Web App,我就得到了相同且非常容易误导的文件未找到异常。

真正的问题是,没有与Web服务帐户关联的用户存储。如果在Windows上访问证书存储时存在与权限相关的错误,也会出现类似错误。

无论如何 - 在我的场景中,我使用MachineKeySet修复了问题: new X509Certificate2(certRawBytes,default(string),X509KeyStorageFlags.MachineKeySet);

所以,在你的场景中,尝试类似:

var keyParams = new CngKeyCreationParameters
{
  KeyCreationOptions = CngKeyCreationOptions.MachineKey,
};
CngKey.Create(CngAlgorithm.Rsa, keyName, keyParams);

注意:您可能需要设置一些参数才能实现上述功能。 Import方法似乎不支持MachineKey - 但您应该能够通过使用Create方法获得类似的结果。

答案 3 :(得分:0)

要添加@ strohmsn的答案,您还可以在Web应用程序的“发布”页面上的Visual Studio中直接使用此值设置App Service设置:右键单击Web应用程序并选择“发布”,然后选择“应用程序服务设置”,然后选择可以在那里添加设置属性:在这种情况下为WEBSITE_LOAD_USER_PROFILE = 1。见截图:

enter image description here