Вопрос по certificate, iis-7 – Разрешения доверия PrivateKey для сертификатов «Надежные корни» локального компьютера

7

У меня есть сертификат, который должен быть импортирован вCertificates/Trusted Root Certification Authorities и имеет соответствующий закрытый ключ.

Чтобы на самом деле получить доступ к ключу из кода, необходимо установить разрешения для закрытого ключа, чтобы предоставить полный доступ к определенному пулу приложений IIS. Я полностью понимаю это, но проблема в том, что это может быть установлено только в личных сертификатах, а не в доверенных корневых.

Я пытался добавить тот же сертификат в Личное хранилище, и следующий код не сломался:

X509Store store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);

foreach (X509Certificate2 cert in store.Certificates)
{
    if (cert.HasPrivateKey)
    {
        // access private key here
    }
}

store.Close();

Установка разрешений на сертификат в личном магазине работает, если я изменяюStoreName.Root вStoreName.My, Я могу получить к нему доступ. Но я не могу получить к нему доступ в корне. Это просто говорит:

Keyset does not exist

Какие-либо предложения?

Additional information

Если я установлю свою идентификацию пулов приложений наLocal System (который имеет общие разрешения для моей машины) я могуsuccessfully доступ к закрытому ключу. Поэтому основной вопрос заключается в том, как настроить разрешения для удостоверения пула приложений, чтобы иметь доступ к закрытым ключам для сертификатов в хранилище доверенных корней.

Why trusted root store and not personal?
I have a pre-built assembly that accesses this certificate in this particular store, so simply placing the certificate in Personal store won't do the trick for me. That's why setting trust permissions on private keys of trusted root certificates is imperative.

Ваш Ответ

3   ответа
3

Windows Server 2003вы заметите, что вы не получаетеManage Private Keys задание по вашему сертификату.

Если вы установитеMicrosoft WSE 2.0 на вашей машине, вы можете использовать инструмент под названиемX509 Certificate Tool, Просто найдите ваш сертификат, скорее всего, он (или должен быть) в Local Machine / Personal Store.

ПРИМЕЧАНИЕ. Если у вас есть сертификат в текущем пользователе / личном хранилище (который часто используется по умолчанию), он будет доступен только пользователю, вошедшему в систему в настоящий момент. Это означает, что если вы хотите, чтобы ваш веб-сервер имел к нему доступ, он может & tpos; t без изменения разрешений для вашего AppPool.

Вы должны иметь возможность очень легко изменить права доступа к закрытому ключу, по умолчанию ваш AppPool на вашем веб-сервере будет использоватьNETWORK SERVICE запустить ваше веб-приложение. Так что просто добавьте NETWORK SERVICE к безопасности и по умолчанию он установитRead and Read / Execute permissions этого достаточно для того, чтобы ваш BouncyCastle и т. д. прочитали закрытый ключ, чтобы вы могли подписать свой документ.

Надеюсь это поможет.

enter image description here

4
Solution

отличных от тех, которые хранятся в хранилище личных сертификатов, но вы не можете устанавливать разрешения через MMC. По крайней мере, не прямо в магазине, который есть. Принятый ответ показывает упрощенный подход с перемещением сертификатов для достижения того же результата.

Вы должны сделать это так ...

Getting the tool Get WF_WCF_Samples file from Microsoft. This is a self extracting archive, but you won't need to extract everything. So... Open the file with any archiver tool and only extract FindPrivateKey solution/project Open in Visual Studio and compile it. Finding your private key Open MMC and add Certificates snap-in. Make sure you select Computer and Local Machine when adding it. Select the store that has your certificate with private key. Open private key and copy its Thumbprint Open command prompt and navigate to the folder where you compiled your FindPrivateKey tool

Enter this command

FindPrivateKey YourStoreName LocalMachine -t "ThumbprintWithSpaces" -a
ie.
FindPrivateKey Root LocalMachine -t "83 45 22 ..." -a

Copy file along with path (it will liekly span over two lines so copy to Notepad and concatenate)

Grant certificate trust

open command prompt and enter:

icacls "FullPathOfYourPrivateKey" /grant:r "UserFQDN":f
ie.
icacls "c:\ProgramData..." /grant:r "IIS AppPool\ASP.NET v4.0":f

Done.

Это обеспечит полное доверие к секретному ключу сертификата для вашего пользователя (в моем случае это будет выше идентификатора пула приложений), так что вы сможете использовать ключ для подписи данных или делать с ним все, что вам нужно.

Если вам не нужны полные разрешения, вы можете легко изменить последнюю часть после двоеточия. Он может иметь много разных настроек, поэтому я настоятельно рекомендую вам проверитьicacls командная помощь.

@ruionwriting: я не понимаю вашего вопроса. Можете ли вы перефразировать это? Robert Koritnik
вот оно, вот оно! спасибо Роберт К. (re: решает проблемы с добавлением разрешений на чтение к серверу win 2003 для приложения IIS. Боже, храни командную строку)
Просматривая сертификаты с помощью MMC, мой сертификат найден @ Personal / Certificates. Как я могу найти правильное значение для YourStoreName?
Что такое «YourStoreName»? для личных сертификатов?
7

но я обнаружил, что самое простое, что можно сделать с другими хранилищами сертификатов, это перетащить сертификат в Личное хранилище, а затем установить разрешения, а затем перетащить обратно в Оригинальный сертификат магазина. В вашем случае доверенные корневые центры сертификации.

Шаги с использованием сертификатов MMC:

Import certificate to the store you want it and mark keys as exportable. (You might be able to bypass this and import directly to the Personal Store, but I haven't tried.) Drag and drop the imported cert to the Personal Store. Right click the certificate in the Personal Store and in the context menu, click "All Tasks", then in the submenu click on "Manage Private Keys". Set the appropriate permissions according to your app pool as referenced in step 1. After permissions have been set, drag and drop the certificate back to the original store (in your case the Trusted Root Certification Authorities).
@sonjz - я предполагаю, что вы используете Windows 2003? Если это так, вам нужно использовать winhttpcertcfg.exe, чтобы предоставить доступ с закрытым ключом к учетной записи NETWORK SERVICE (или учетной записи, которая требует разрешения). Приведенная выше ссылка на шаге 3 предназначена для Windows 2008 R2 (может работать и в R1).
+1 Это очень интересный подход. И чтобы подтвердить ваш процесс, он работает и для доверенного корневого хранилища. Перетащите, установите, перетащите, и все готово. Большой! Robert Koritnik
@RobertKoritnik: так это решило твою проблему?
на сервере win2003 я не получаю «Управление частными ключами» из хранилища сертификатов для Персонального / Сертификаты / & lt; cert & gt; как уже упоминалось. кто-нибудь сталкивался с этим?
Да, конечно. Я подтвердил в предыдущем комментарии. Он также работает с Trusted Root store. Работает. Просто. Robert Koritnik

Похожие вопросы