如何从天蓝色的密钥库中获取作为受密码保护的pfx的Byte []的私钥

吉姆

我正在使用GetSecretAsync()方法从Azure密钥保管库中获取证书,然后期望最终获得私钥的byte []和证书。

我在.netcore3.1中有我的应用程序,这是我的代码的样子:

var certWithPrivateKey = Client.GetSecretAsync(ConfigurationSettings.AppSettings["AKVEndpoint"], ConfigurationSettings.AppSettings["CertName"]).GetAwaiter().GetResult();
var privateKeyBytes = Convert.FromBase64String(certWithPrivateKey.Value);

X509Certificate2 x509Certificate = new X509Certificate2(privateKeyBytes);
var privateKey = x509Certificate.GetRSAPrivateKey() as RSA;

我得到了类型为RSACng的有效privateKey,但是对其进行的任何操作(尝试ExportRSAPrivateKey())都会引发“ privateKey.ExportRSAPrivateKey()”错误,并引发类型为“ Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException”和不支持请求的操作。”

我不确定接下来如何获取私钥和​​证书的byte []。

巴顿

由于您实际上似乎确实需要导出:您当前的代码不会将私钥加载为可导出的,因此无法导出。解决方法是声明可导出性:

X509Certificate2 x509Certificate =
    new X509Certificate2(privateKeyBytes, "", X509KeyStorageFlags.Exportable);

如果这还不够,那么您将遇到CAPI可导出性和CNG可导出性之间的差异(Windows较新的加密库)。如果来自PFX / PKCS#12的私钥被加载到CNG中,则它只是“加密的可导出”,而ExportParameters是纯文本导出。

不过,有一种解决方法...将其加密导出,然后使用更灵活的导出策略将其导入其他地方,然后再次导出。

此代码段使用.NET Core 3.0+ ExportPkcs8PrivateKey()方法,因为这是您希望数据使用的格式,并且使用新的.NET 5 PemEncoding类来简化将DER编码的输出转换为PEM + DER输出。如果您的导出器位于.NET Framework上,则这是一个更复杂的问题对于.NET Standard 2.0,实际上不是一个干净的解决方案(是否可以调用.NET Core / .NET 5的方法,是否对.NET Framework使用Windows特定的版本?)。

byte[] pkcs8PrivateKey;

using (RSA privateKey = x509Certificate.GetRSAPrivateKey())
{
    pkcs8PrivateKey = ExportPrivateKey(privateKey);
}

File.WriteAllText(
    "tls.cer",
    new string(PemEncoding.Write("CERTIFICATE", x509Certificate.RawData));

File.WriteAllText(
    "tls.key",
    new string(PemEncoding.Write("PRIVATE KEY", pkcs8PrivateKey));

...

private static byte[] ExportPrivateKey(RSA privateKey)
{
    try
    {
        // If it's plaintext exportable, just do the easy thing.
        return privateKey.ExportPkcs8PrivateKey();
    }
    catch (CryptographicException)
    {
    }

    using (RSA exportRewriter = RSA.Create())
    {
        // Only one KDF iteration is being used here since it's immediately being
        // imported again.  Use more if you're actually exporting encrypted keys.
        exportRewriter.ImportEncryptedPkcs8PrivateKey(
            "password",
            privateKey.ExportEncryptedPkcs8PrivateKey(
                "password",
                new PbeParameters(
                    PbeEncryptionAlgorithm.Aes128Cbc,
                    HashAlgorithmName.SHA256,
                    1)),
            out _);

        return exportRewriter.ExportPkcs8PrivateKey();
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

PHP:从单行私钥获取私钥

来自分类Dev

在PHP中获取私钥.pfx

来自分类Dev

在PHP中获取私钥.pfx

来自分类Dev

在C ++中使用密码保护私钥

来自分类Dev

缺少PFX或证书+私钥

来自分类Dev

OpenSSL SSLDSA:私钥密码

来自分类Dev

如何导出ECDiffieHellmanCng的私钥

来自分类Dev

如何找到私钥位置

来自分类Dev

如何安装ssh私钥?

来自分类Dev

将私钥导入密钥库

来自分类Dev

从私钥或密钥库生成CSR

来自分类Dev

从私钥或密钥库生成CSR

来自分类Dev

错误的 RSA 私钥密钥库

来自分类Dev

如何使用已经给定的私钥作为 PHP 中的私钥资源?

来自分类Dev

JAVA:如何使用密码保护将私钥保存在pem文件中

来自分类Dev

JAVA:如何使用密码保护将私钥保存在pem文件中

来自分类Dev

ECC密钥对-如何打印私钥?

来自分类Dev

如何检索私钥的密码短语?

来自分类Dev

如何检索私钥的密码短语?

来自分类Dev

如何从Azure密钥保管库中的证书中获取私钥?

来自分类Dev

在Android上通过生物识别或应用密码保护私钥

来自分类Dev

测试SSH私钥是否具有密码保护

来自分类Dev

SSH密码保护的私钥仍然可见

来自分类Dev

自动代码签名-保护私钥

来自分类Dev

如何从私钥获取SFTP的密钥指纹?

来自分类Dev

SSH私钥的密码是什么?

来自分类Dev

解密用私钥签名的byte []

来自分类Dev

从私钥获取SSL证书文件

来自分类Dev

以RAW格式获取RSA私钥