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