Разрешения доверия PrivateKey для локальных сертификатов "Доверенные корни"

У меня есть сертификат, который необходимо импортировать в Сертификаты/доверенные корневые центры сертификации и имеет соответствующий закрытый ключ.

Чтобы получить доступ к ключу из кода, вам необходимо установить права доступа к секретному ключу, чтобы предоставить полный доступ к определенному пулу приложений 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. Я могу получить к нему доступ. Но я не могу получить доступ к нему в корне. Он просто говорит:

Ключ не существует

Любые предложения?

Дополнительная информация

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

Почему доверенное корневое хранилище, а не личное?
У меня есть готовая сборка, которая обращается к этому сертификату в этом конкретном магазине, поэтому простое размещение сертификата в Личном магазине не будет делать трюк для меня. Поэтому необходимо установить доверительные разрешения для закрытых ключей доверенных корневых сертификатов.

Ответ 1

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

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

  • Импортировать сертификат в необходимый вам магазин и пометить ключи как экспортируемые. (Возможно, вы можете обойти это и импортировать непосредственно в Личный магазин, но я рад 't попытался.)
  • Перетащите импортированный сертификат в Личный магазин.
  • Щелкните правой кнопкой мыши сертификат в Личном хранилище и в контекстном меню нажмите "Все задачи", затем в подменю нажмите "Управление приватными ключами". Задайте соответствующие разрешения в соответствии с вашим пулом приложений как указанные в шаге 1.
  • После того, как были установлены разрешения, перетащите сертификат обратно в исходное хранилище (в вашем случае доверенные корневые центры сертификации).

Ответ 2

Решение

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

Вы должны сделать это таким образом...

Получение инструмента

  • Получить файл WF_WCF_Samples от Microsoft. Это самораспаковывающийся архив, но вам не нужно будет извлекать все. Так что...
  • Откройте файл с любым инструментом архиватора и извлеките FindPrivateKey решение/проект
  • Открыть в Visual Studio и скомпилировать его.

Поиск частного ключа

  • Откройте консоль MMC и добавьте оснастку "Сертификаты". Убедитесь, что вы выбрали "Компьютер и локальная машина" при добавлении.
  • Выберите хранилище с сертификатом с закрытым ключом.
  • Откройте закрытый ключ и скопируйте его Thumbprint
  • Откройте командную строку и перейдите в папку, в которой вы скомпилировали инструмент FindPrivateKey.
  • Введите эту команду

    FindPrivateKey YourStoreName LocalMachine -t "ThumbprintWithSpaces" -a
    то есть.
    FindPrivateKey Root LocalMachine -t "83 45 22..." -a

  • Скопируйте файл вместе с путем (он будет лежать в пределах двух строк, поэтому скопируйте его в Блокнот и соедините)

Доверительное управление сертификатом

  • откройте командную строку и введите:

    icacls "FullPathOfYourPrivateKey" /grant: r "UserFQDN": f
    то есть.
    icacls "c:\ProgramData..." /grant: r "IIS AppPool\ASP.NET v4.0": f

  • Готово.

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

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

Ответ 3

Если вы используете Windows Server 2003, вы заметите, что вы не получаете задачу Управление приватными ключами под своим сертификатом.

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

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

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

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

enter image description here