Загрузка серверного сертификата * и * закрытого ключа из хранилища сертификатов Windows Server?
Я пытаюсь получить этот внешний веб-сервис REST, который требует как серверный сертификат, так и закрытый ключ (оба из которых я получил от издателя как *.pem
файлы этого сервиса).
Для моего тестирования я гуглил и нашел способ объединить эти две части в *.pfx
файл - и загрузка X509Certificate2
экземпляр из этого двоичного файла на диске работает просто отлично.
Теперь я пытался поместить это в Cert Store на моем рабочем сервере Windows Server 2008.
Я могу получить X509Certificate2
из магазина сертификатов в моем коде C# - нет проблем:
X509Store store = new X509Store(StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certs = store.Certificates.Find(X509FindType.FindBySerialNumber, "serial-number-here", false);
if (certs.Count > 0)
{
X509Certificate2 cert = certs[0];
// set the certificate on the RestClient to call my REST service
_restClient.ClientCertificates.Add(cert);
}
store.Close();
Но когда я делаю это, тогда веб-сервис раздражает меня, утверждая, что ему нужен "SSL-сертификат"...
Также: когда я загружал X509Certificate2
с диска, с того *.pfx
файл, я должен был предоставить пароль - здесь ничего не нужно указывать при загрузке из хранилища сертификатов.... странно....
Кажется, что хотя я импортировал *.pfx
который содержит сертификат на стороне сервера и наш закрытый ключ, так или иначе я не могу получить оба обратно из хранилища сертификатов...
Любая идея, как я могу заставить это работать? Нужно ли загружать закрытый ключ из хранилища сертификатов на втором этапе? Как?
Эти сертификаты до сих пор остаются для меня большой загадочной загадкой... Может ли кто-нибудь просветить меня?
2 ответа
Первым делом нужно проверить, есть ли у хранилища сертификатов закрытый ключ.
- Откройте snappin для управления сертификатами и найдите свой сертификат, дважды щелкните по нему и убедитесь, что он выделен красным цветом, как показано на рисунке ниже:
Затем, если закрытый ключ находится в хранилище, возможно, учетная запись, обращающаяся к сертификату, не имеет разрешений на закрытый ключ. Есть два способа проверить это:
- В snappin управления сертификатами щелкните правой кнопкой мыши сертификат> Все задачи> Управление закрытыми ключами. (Вы должны иметь возможность проверять и редактировать разрешения здесь)
- В вашем коде вы можете получить доступ к свойству PrivateKey (т. Е. Сделать var privateKey = cert.PrivateKey и посмотреть, вернете ли вы его обратно).
Вы не написали, как реализован веб-сервис.
- если он развернут на IIS
- если это самостоятельно
Ваш код для получения сертификата из магазина правильный. Вопрос в том, куда вы импортировали хранилище pfx - CurrentUser или LocalMachine. Вы используете хранилище CurrentUser в примере кода. Если вы импортировали сертификат в хранилище LocalMachine, он не будет найден. Также, пожалуйста, укажите имя магазина - StoreName.My (в MMC или certmgr.msc это означает Personal) в конструкторе X509Store (это может быть по умолчанию, но кто все равно знает все значения по умолчанию:))
Но когда я делаю это, тогда веб-сервис раздражает меня, утверждая, что ему нужен "SSL-сертификат"...
Вы должны убедиться, что у вас есть Client Authentication
в расширенном ключе использование сертификата.
Также: когда я загружал X509Certificate2 с диска, из этого *.pfx-файла мне приходилось вводить пароль - здесь ничего не нужно указывать при загрузке из хранилища сертификатов.... странно....
Это как это работает. Когда у вас есть pfx, тогда закрытый ключ в нем защищен / зашифрован паролем (пароль может быть пустой строкой). Когда вы импортируете pfx в хранилище сертификатов, тогда закрытый ключ защищается / шифруется другим ключом (точно не известно, что это за ключ). Однако вы можете добавить еще один уровень защиты к закрытому ключу, указав надежную защиту при импорте pfx в хранилище (я не рекомендую его использовать с ASP.NET, веб-службами или чем-либо, что не имеет рабочего стола). Но если это ваш личный сертификат для подписи электронных писем, то было бы неплохо включить его. После этого Windows будет открывать окно всякий раз, когда приложение будет пытаться использовать закрытый ключ.
@DanL может быть прав насчет прав на закрытый ключ и его
1) - установить права на закрытый ключ и
2) - доступ к закрытому ключу в X509Certificate2
написано хорошо. Я хотел бы просто добавить к 1), что вы пытаетесь подключиться к службе REST из приложения ASP.NET или другого веб-сервиса на IIS, тогда имя учетной записи, для которой необходимо добавить разрешение, - IIS APPPOOL\name_of_the_apppool_your_app_runs_under