2016-01-21 6 views
0

Я пытаюсь расшифровать некоторые данные с помощью закрытого ключа сертификата. Все работает нормально, когда сертификат установлен на локальном компьютере (я использую самоподписанный сертификат для тестирования, и у меня есть закрытый ключ для сертификата), но когда я пытаюсь получить доступ к закрытому ключу с удаленной машины с использованием того же кода , Я получаю исключение «Ключ не существует».«System.Security.Cryptography.CryptographicException: Keyset не существует» при чтении закрытого ключа с удаленной машины

Я использую консольное приложение для тестирования, и я удостоверился, что мой идентификатор имеет права доступа на закрытый ключ на удаленном сервере. Вот пример кода, я использую:

var store = new X509Store(@"\\server1\My", StoreLocation.LocalMachine); 
store.Open(OpenFlags.ReadOnly); 
var result = store.Certificates.Find(X509FindType.FindBySubjectName, "server1.test.com", false); 
var certificate = result[0]; 
store.Close(); 

//This succeeds from both local and remote server 
var rsaPublic = (RSACryptoServiceProvider)certificate.PublicKey.Key; 

//This succeeds from local, but fails from remote server 
var rsaPrivate = (RSACryptoServiceProvider)certificate.PrivateKey; 

Здесь стек вызовов исключение

Unhandled Exception: System.Security.Cryptography.CryptographicException: Keyset does not exist 

    at System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer) 
    at System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle) 
    at System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair() 
    at System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 dwKeySize, CspParameters parameters, Boolean useDefaultKeySize) 
    at System.Security.Cryptography.X509Certificates.X509Certificate2.get_PrivateKey() 
    at RsaPoc.Program.Main(String[] args) 

Я нашел similar без ответа вопрос о SO, но с использованием не-управляемый код, в то время как I Я использую управляемый API, но оба они имеют одну и ту же причину.

ответ

0

Мы связались с поддержкой Microsoft для решения, и вот ответ, который мы получили:

  1. Почему секретный ключ не доступен, когда код выполняется на server2?
    A: Это на самом деле по дизайну. Хранилища сертификатов отличаются от хранилищ секретного ключа. Хотя вы можете перечислить сертификаты удаленно, доступ к закрытым ключам удаленно невозможно.

  2. Можно ли устранить эту проблему, предоставив пользователю дополнительные привилегии или изменения в настройках групповой политики? A: Нет. Это не требует прав или прав доступа к файлу.

  3. Если не оба вышеупомянутых, вы можете предложить подходящее решение?
    A: 1. Вы можете установить сертификат на всех машинах, чтобы каждый из них имел копию закрытого ключа.
    2. Вы можете создать пользователя домена роуминга. Роуминг-сертификат - единственная ситуация, когда частные ключи могут перемещаться между машинами. Роуминг-профили расположены на сервере, когда пользователь входит в систему, создается временная копия профиля (включая закрытый ключ).
    3. Используйте сторонний поставщик криптографии. Существуют некоторые криптографические провайдеры, которые позволяют удаленный доступ к закрытому ключу и криптографические операции.