Как установить разрешение на чтение файла закрытого ключа сертификата X.509 из .NET.

Вот код для добавления pfx в магазин Cert.

X509Store store = new X509Store( StoreName.My, StoreLocation.LocalMachine ); store.Open( OpenFlags.ReadWrite ); X509Certificate2 cert = new X509Certificate2( "test.pfx", "password" ); store.Add( cert ); store.Close(); 

Однако я не смог найти способ установить разрешение для доступа к закрытому ключу NetworkService.

Может ли кто-нибудь пролить свет? Заранее спасибо.

Чтобы сделать это программно, вам нужно сделать три вещи:

  1. Получить путь к папке с закрытым ключом.

  2. Получить имя файла закрытого ключа в этой папке.

  3. Добавьте разрешение на этот файл.

См. Это сообщение для некоторого примера кода, который выполняет все три (в частности, посмотрите на метод AddAccessToCertificate).

Этот ответ поздний, но я хотел опубликовать его для любого другого, кто приходит сюда:

Я нашел статью в блоге MSDN, которая предоставила решение с использованием CryptoKeySecurity здесь , и вот пример решения в C #:

 var rsa = certificate.PrivateKey as RSACryptoServiceProvider; if (rsa != null) { // Modifying the CryptoKeySecurity of a new CspParameters and then instantiating // a new RSACryptoServiceProvider seems to be the trick to persist the access rule. // cf. http://blogs.msdn.com/b/cagatay/archive/2009/02/08/removing-acls-from-csp-key-containers.aspx var cspParams = new CspParameters(rsa.CspKeyContainerInfo.ProviderType, rsa.CspKeyContainerInfo.ProviderName, rsa.CspKeyContainerInfo.KeyContainerName) { Flags = CspProviderFlags.UseExistingKey | CspProviderFlags.UseMachineKeyStore, CryptoKeySecurity = rsa.CspKeyContainerInfo.CryptoKeySecurity }; cspParams.CryptoKeySecurity.AddAccessRule(new CryptoKeyAccessRule(sid, CryptoKeyRights.GenericRead, AccessControlType.Allow)); using (var rsa2 = new RSACryptoServiceProvider(cspParams)) { // Only created to persist the rule change in the CryptoKeySecurity } } 

Я использую SecurityIdentifier для идентификации учетной записи, но NTAccount будет работать так же хорошо.

В случае, если это поможет кому-то еще, я написал ответ Джима Флуда в Powershell

 function Set-PrivateKeyPermissions { param( [Parameter(Mandatory=$true)][string]$thumbprint, [Parameter(Mandatory=$false)][string]$account = "NT AUTHORITY\NETWORK SERVICE" ) #Open Certificate store and locate certificate based on provided thumbprint $store = New-Object System.Security.Cryptography.X509Certificates.X509Store("My","LocalMachine") $store.Open("ReadWrite") $cert = $store.Certificates | where {$_.Thumbprint -eq $thumbprint} #Create new CSP object based on existing certificate provider and key name $csp = New-Object System.Security.Cryptography.CspParameters($cert.PrivateKey.CspKeyContainerInfo.ProviderType, $cert.PrivateKey.CspKeyContainerInfo.ProviderName, $cert.PrivateKey.CspKeyContainerInfo.KeyContainerName) # Set flags and key security based on existing cert $csp.Flags = "UseExistingKey","UseMachineKeyStore" $csp.CryptoKeySecurity = $cert.PrivateKey.CspKeyContainerInfo.CryptoKeySecurity $csp.KeyNumber = $cert.PrivateKey.CspKeyContainerInfo.KeyNumber # Create new access rule - could use parameters for permissions, but I only needed GenericRead $access = New-Object System.Security.AccessControl.CryptoKeyAccessRule($account,"GenericRead","Allow") # Add access rule to CSP object $csp.CryptoKeySecurity.AddAccessRule($access) #Create new CryptoServiceProvider object which updates Key with CSP information created/modified above $rsa2 = New-Object System.Security.Cryptography.RSACryptoServiceProvider($csp) #Close certificate store $store.Close() } 

Обратите внимание, что параметр учетной записи может быть в форме «DOMAIN \ USER» (а не только в именах) – я тестировал это в своей среде и автоматически конвертировал его в соответствующий идентификатор SID

Вы можете использовать инструмент WinHttpCertCfg.exe, который поставляется как часть средств набора ресурсов Windows Server 2003 .

Пример:

 winhttpcertcfg -g -c LOCAL_MACHINE\My -s test -a NetworkService 

Кроме того, вы можете использовать инструмент « Найти частный ключ», который поставляется вместе с WCF SDK, чтобы найти местоположение на диске файла закрытого ключа сертификата. Затем вы можете просто использовать ACL для установки правильных прав в файле.

Пример:

 FindPrivateKey My LocalMachine -n "CN=test" 

Это решение, которое я нашел для Windows Server 2008, если кому-то было интересно: http://technet.microsoft.com/en-us/library/ee662329.aspx

В принципе, я должен был предоставить разрешения для службы, которая должна получить доступ к сертификату с помощью инструмента MMC. Работает как шарм.

  • Как настроить SSL-сертификат для сервера express.js?
  • Как добавить самозаверяющий сертификат в качестве исключения в Chrome?
  • Сертификат клиента SSL в Maven
  • Игнорировать недопустимый самоподписанный сертификат ssl в node.js с https.request?
  • Безопасное исправление: javax.net.ssl.SSLPeerUnverifiedException: нет однорангового сертификата
  • Не удалось установить пакеты Python
  • Создавать самостоятельно подписанный сертификат на лету
  • Возможно ли преобразовать SSL-сертификат из файла .key в .pfx?
  • Присвоение имени домена локальному хосту для среды разработки
  • как добавить терминологическое имя объекта в ssl certs?
  • curl: (60) SSL-сертификат: не удалось получить сертификат локального эмитента
  • Interesting Posts

    Терминология HAS-A, IS-A в объектно-ориентированном языке

    Те же данные из разных объектов в базе данных – наилучшая практика – пример номеров телефонов

    Фильтрация дублированных / неповторных строк в data.table

    Интернет и электронная почта

    Форма слишком большого исключения

    Как заставить SSL / https в Express.js

    Получить имя classа объекта как строку в Swift

    Код элемента Entity Framework (EF) Первый каскадный вывод для отношения «один к нулю» или «один»

    Получить текущую позицию прокрутки ScrollView в React Native

    Инициализаторы модhive в C #

    String.Format целое число, чтобы использовать разделитель тысяч без десятичных знаков или число 0 для малых целых чисел

    FFMPEG Windows Generate 360p Video conversion failed

    Как редактировать реестр из инструмента восстановления Vista?

    Как сообщить Json.Net глобально применить StringEnumConverter ко всем enumsм

    Все библиотеки com.android.support должны использовать ту же самую спецификацию версии

    Давайте будем гением компьютера.