无法在 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;
    }
}