无法在 Azure 中访问我的 X509Certificate 2 的私钥
Unable to access my X509Certificate2's PrivateKey In Azure
我将我的 X509 证书存储在数据库中(在 byte[]
中),以便我的应用程序可以检索证书并使用它来签署我的 JWT。
我的 x509Certificate 是从我在我的机器上生成的 .pfx 文件传递过来的,但是现在它以字节串的形式存在于数据库中。
当我 运行 我的应用程序在本地运行得非常好。该应用程序可以正确创建该 X509Certificate2 的实例并将其用于我的要求,但是当我尝试在我的 azurewebsites web 应用程序中使用它时出现问题。
基本上我无法访问证书的 PrivateKey 实例变量,我得到一个异常
System.Security.Cryptography.CryptographicException: Keyset does not exist
我正在用这个重新实例化证书
var cert = new X509Certificate2(myCertInBytes, myCertPass,
X509KeyStorageFlags.PersistKeySet |
X509KeyStorageFlags.MachineKeySet |
X509KeyStorageFlags.Exportable);
我正在使用 ASPNET 5 rc1-update1。我也在另一台机器上尝试 运行ning 它并且工作正常,只有当我发布到 Azure 时才会出现这个问题。并且还要添加其他内容,当我 运行 使用 DNX 版本 beta7
宁 运行 同一个项目时,该应用程序正在运行
感谢任何帮助。
问题是 Azure Web Apps 限制了对机器私钥存储的访问,因为它是一个共享的托管环境,而你并不完全拥有机器。作为解决方法,您可以加载证书。这篇博客 post 描述了如何做到这一点的最佳实践:
https://azure.microsoft.com/en-us/blog/using-certificates-in-azure-websites-applications/
请注意,这仅适用于基本层及以上层(不适用于免费层或共享层)。
这也可以通过 .cer 文件完成,如下所示,但是应该注意,这不是最佳做法,因为您正在以不安全的格式存储代码中的安全凭据。
public X509Certificate2 CertificateFromStrings(String certificateString64, String privateKeyXml)
{
try
{
var rsaCryptoServiceProvider = new RSACryptoServiceProvider();
rsaCryptoServiceProvider.FromXmlString(privateKeyXml);
var certificateBytes = Convert.FromBase64String(certificateString64);
var x509Certificate2 = new X509Certificate2(certificateBytes);
x509Certificate2.PrivateKey = rsaCryptoServiceProvider;
return x509Certificate2;
}
catch
{
return null;
}
}
我将我的 X509 证书存储在数据库中(在 byte[]
中),以便我的应用程序可以检索证书并使用它来签署我的 JWT。
我的 x509Certificate 是从我在我的机器上生成的 .pfx 文件传递过来的,但是现在它以字节串的形式存在于数据库中。
当我 运行 我的应用程序在本地运行得非常好。该应用程序可以正确创建该 X509Certificate2 的实例并将其用于我的要求,但是当我尝试在我的 azurewebsites web 应用程序中使用它时出现问题。
基本上我无法访问证书的 PrivateKey 实例变量,我得到一个异常
System.Security.Cryptography.CryptographicException: Keyset does not exist
我正在用这个重新实例化证书
var cert = new X509Certificate2(myCertInBytes, myCertPass,
X509KeyStorageFlags.PersistKeySet |
X509KeyStorageFlags.MachineKeySet |
X509KeyStorageFlags.Exportable);
我正在使用 ASPNET 5 rc1-update1。我也在另一台机器上尝试 运行ning 它并且工作正常,只有当我发布到 Azure 时才会出现这个问题。并且还要添加其他内容,当我 运行 使用 DNX 版本 beta7
宁 运行 同一个项目时,该应用程序正在运行感谢任何帮助。
问题是 Azure Web Apps 限制了对机器私钥存储的访问,因为它是一个共享的托管环境,而你并不完全拥有机器。作为解决方法,您可以加载证书。这篇博客 post 描述了如何做到这一点的最佳实践: https://azure.microsoft.com/en-us/blog/using-certificates-in-azure-websites-applications/
请注意,这仅适用于基本层及以上层(不适用于免费层或共享层)。
这也可以通过 .cer 文件完成,如下所示,但是应该注意,这不是最佳做法,因为您正在以不安全的格式存储代码中的安全凭据。
public X509Certificate2 CertificateFromStrings(String certificateString64, String privateKeyXml)
{
try
{
var rsaCryptoServiceProvider = new RSACryptoServiceProvider();
rsaCryptoServiceProvider.FromXmlString(privateKeyXml);
var certificateBytes = Convert.FromBase64String(certificateString64);
var x509Certificate2 = new X509Certificate2(certificateBytes);
x509Certificate2.PrivateKey = rsaCryptoServiceProvider;
return x509Certificate2;
}
catch
{
return null;
}
}