0

Я загрузил сертификат Azure KeyVault и получил «все» доступ к нему с помощью приложения, зарегистрированного в Active Directory. Все работает отлично. Теперь мне нужно загрузить полученный ключ в X509Certificate, чтобы иметь возможность использовать его в качестве клиентского сертификата для вызова веб-сервиса SOAP 3rdparty. Насколько я знаю, я могу использовать только сертификат X509 для вызова этого веб-сервиса.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 { "не удается найти требуемый объект \ г \ п."}

Ahhhh

вторая попытка, загружая его в 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 { "Не удается найти запрашиваемый объект. \ Г \ п"}

Любое предложение можно только приветствовать.

мне нужна PFX включая частный ключ, глядя на tracelog

ystem.Net информация: 0: [37880] SecureChannel # 23107755 - Оставшись с 1 сертификатов клиента на выбор. Информация о System.Net: 0: [37880] SecureChannel # 23107755 - попытка найти соответствующий сертификат в хранилище сертификатов. System.Net Информация: 0: [37880] SecureChannel # 23107755 - Обнаружение закрытого ключа для сертификата: [Тема]

+0

Кажется, Microsoft очень занята с улучшенной библиотекой 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

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

см. новую функцию сертификатов в Key Vault. Он позволяет сгенерировать вашу пару ключей внутри Key Vault, сгенерировать (или получить) сертификат и сохранить его автоматически обновленным. Вот учебник. https://blogs.technet.microsoft.com/kv/2016/09/26/get-started-with-azure-key-vault-certificates/ –