0

我将证书上载到Azure KeyVault,并使用注册到Active Directory的应用程序获得对它的“全部”访问。这一切都很好。现在我需要将获得的密钥加载到X509Certificate中,以便能够将其用作调用第三方遗留SOAP Web服务的客户端证书。据我所知,我只能使用X509Certificate来调用该Web服务。Azure KeyVault如何加载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,但无论我尝试我最终例外:(

1日尝试我想:

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

System.Security.Cryptography.CryptographicException { “无法找到请求的对象\ r \ n。”}

AHHHH

第2次尝试,它加载到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); 

没有私钥以及,公钥是不同的。当然这也行不通。

第三尝试

我使用管理门户上传它作为一个秘密证书的ContentType。

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

+0

看来微软是非常繁忙的一个改进KeyVault库,样品至少..在一个叉:https://开头github.com/Azure/azure-sdk-for-net/tree/93c8ebcf01461ed5d838837dc7dbb7b3f507eec0/src/KeyVault/Microsoft.Azure.KeyVault/Customized – rfcdejong

回答

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); 
+1

请参阅Key Vault中的新证书功能。它允许您在Key Vault中生成密钥对,生成(或获取)证书,并使其自动续订。这是一个教程。 https://blogs.technet.microsoft.com/kv/2016/09/26/get-started-with-azure-key-vault-certificates/ –

相关问题