Можно ли получить сертификат X509Certificate из хранилища сертификатов с помощью ASP.NET без разрешений файловой системы?
-
20-12-2019 - |
Вопрос
Где должен быть сертификат, указанный в Trusted Root Certification Authorities
узел в certmgr.msc храниться так, чтобы веб-приложение IIS могло получить его и подписать с его помощью утверждение SAML?Есть ли способ напрямую извлечь сертификат из «улья» сертификатов, не требуя разрешений файловой системы?Или необходимо экспортировать сертификат в папку, к которой у встроенного пользователя IIS7 есть права доступа?
А X509Certificate2.Import()
первый параметр метода fileName
.
Если я экспортирую сертификат и помещу файл в иерархию папок проекта Visual Studio 2012 и предоставлю полный путь к Импорт() метод, импорт сертификата завершается успешно, но только если приложение работает в Visual Studio встроенный сервере, а не в том случае, если он работает на локальном веб-сервере IIS.
Я пробовал использовать Дружественное имя с X509KeyStorageFlags.MachineKeySet
но это не сработало.
РЕДАКТИРОВАТЬ:Это работает при использовании встроенного сервера Visual Studio, но не ЛОКАЛЬНОГО сервера IIS7 в Windows 7:
certStore = New X509Store(StoreLocation.CurrentUser)
certStore.Open(OpenFlags.ReadOnly)
Dim thumbprint As String
thumbprint = ConfigurationManager.AppSettings("thumb").ToString
certCollection = certStore.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, False)
certStore.Close()
cert = certCollection(0)
поэтому мне нужно выяснить, как предоставить пулу приложений по умолчанию доступ к этому сертификату в Windows 7.
Решение
Вы не «импортируете», просто создаете экземпляр.Формально вы открываете хранилище ключей и просматриваете сертификаты.И да, вам не нужны какие-либо разрешения файловой системы, однако для доступа к закрытому ключу идентификатор вашего пула приложений должен иметь разрешение на доступ к ключу, вы устанавливаете разрешение в оснастке сертификата консоли mmc.
Редактировать:код для доступа к сертификату будет выглядеть примерно так:
var store = new X509Store( name, location );
store.Open( OpenFlags.ReadOnly );
foreach ( var cert in store.Certificates )
... loop and match, by thumbprint, friendly name or whatever else