【问题标题】:Azure KeyVault how to load X509Certificate? [duplicate]Azure KeyVault 如何加载 X509Certificate? [复制]
【发布时间】:2017-03-02 07:01:43
【问题描述】:

我将证书上传到 Azure KeyVault,并使用注册到 Active Directory 中的应用程序获得了对它的“全部”访问权限。这一切都很好。现在我需要将获得的密钥加载到 X509Certificate 中,以便能够将其用作调用 3rdparty 旧版 SOAP Web 服务的客户端证书。据我所知,我只能使用 X509Certificate 来调用该网络服务。

我将它作为密钥还是秘密上传都没有关系?我都试过了。

var clientId = "...."
var clientSecret = "...."

..
var token = authenticationContext.GetAccessToken(resource, adCredential);
var keyClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(token));
KeyBundle key = keyClient.GetKeyAsync("https://mycertifcates.vault.azure.net/keys/MyCertificate/123456789");

到目前为止一切顺利,结果我得到了一个 KeyBundle,似乎我可以将它转换为 Base64String,但无论我尝试什么,最终都会出现异常 :(

我尝试的第一次尝试:

            var publicKey = Convert.ToBase64String(key.Key.N);
            var cert = X509Certificate.FromBase64String(publicKey);

System.Security.Cryptography.CryptographicException {"找不到请求的对象。\r\n"}

啊哈

第二次尝试,将其加载到 RSACryptoServiceProvider 中,但是如何处理呢?结果出现相同的异常,如果我想,我什至无法获得私钥

        var rsaCryptoProvider = new RSACryptoServiceProvider();
        var rsaParameters = new RSAParameters()
        {
            Modulus = key.Key.N,
            Exponent = key.Key.E
        };
        rsaCryptoProvider.ImportParameters(rsaParameters);
        var cspBlob = rsaCryptoProvider.ExportCspBlob(false);

        // what to do with the cspBlob ?
        var publicKey = Convert.ToBase64String(cspBlob);

也没有私钥,公钥不同。当然这也不行。

第三次尝试

我使用管理门户将其作为秘密证书内容类型上传。

            var secret = helper.GetSecret("https://myCertificate.vault.azure.net/secrets/MyCertificate/1234567890");

            var value = secret.Value;

            // Now I got the secret.. works flawless
            // But it crash with the same exception at .Import
            var exportedCertCollection = new X509Certificate2Collection();
            exportedCertCollection.Import(Convert.FromBase64String(value));
            var cert2 = exportedCertCollection.Cast<X509Certificate2>().Single(s => s.HasPrivateKey);

System.Security.Cryptography.CryptographicException {"找不到 请求的对象。\r\n"}

欢迎提出任何建议。

我需要包含私钥的 pfx,查看跟踪日志

ystem.Net 信息:0:[37880] SecureChannel#23107755 - 剩下 1 个客户端证书可供选择。 System.Net 信息:0:[37880] SecureChannel#23107755 - 尝试在证书存储中查找匹配的证书。 System.Net 信息:0:[37880] SecureChannel#23107755 - 查找证书的私钥:[主题]

【问题讨论】:

标签: x509certificate rsacryptoserviceprovider azure-keyvault


【解决方案1】:

回答我自己的问题(我猜我问得太快了)

原来这个问题其实是重复的,但我一开始没看懂。事实上,Azure 管理门户是有限的。目前只能通过使用 powershell(或其他代码)来上传证书。

https://stackoverflow.com/a/34186811/578552

第三次尝试代码适用于 X509Certificate2

        var secret = helper.GetSecret("https://myCertificate.vault.azure.net/secrets/MyCertificate/1234567890");

        var exportedCertCollection = new X509Certificate2Collection();
        exportedCertCollection.Import(Convert.FromBase64String(secret.Value));
        var cert2 = exportedCertCollection.Cast<X509Certificate2>().Single(s => s.HasPrivateKey);

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
  • 1970-01-01
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多