0

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

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

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 - 查找证书的私钥:[主题]

4

1 回答 1

2

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

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

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

第 3 次尝试代码适用于 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);
于 2016-10-20T15:38:15.047 回答