logo Наши способы организации безопасного удалённого доступа к рабочим местам и корпоративным ресурсам
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline kmi  
#1 Оставлено : 27 июня 2016 г. 15:01:40(UTC)
kmi

Статус: Активный участник

Группы: Участники
Зарегистрирован: 18.12.2012(UTC)
Сообщений: 49
Откуда: Москва

Сказал(а) «Спасибо»: 8 раз
Для подписи данных используется КриптоПро CSP 3.6.6497 КС1 3.6.5359 в сочетании с КриптоПро .NET Server 1.0.4863.0

Контейнер, список отзыва и сертификат установлены. Тестирование через оснастку КриптоПро CSP проходит корректно. На локальном месте разработчика с тем же сертификатом на IIS Express приложение работает корректно. Однако при развёртывании ASP.NET приложения на IIS 7 и на сервере, и на том же локальном месте разработчика возникает ошибка, указанная ниже. С чем может быть связана эта ошибка?

WebHost failed to process a request.
Sender Information: System.ServiceModel.ServiceHostingEnvironment+HostingManager/24002550
Exception: System.ServiceModel.ServiceActivationException: The service '/PersonalApiService.svc' cannot be activated due to an exception during compilation. The exception message is: It is likely that certificate 'CN=my.site.ru' may not have a private key that is capable of key exchange or the process may not have access rights for the private key. Please see inner exception for detail.. ---> System.ArgumentException: It is likely that certificate 'CN=my.site.ru' may not have a private key that is capable of key exchange or the process may not have access rights for the private key. Please see inner exception for detail. ---> System.Security.Cryptography.CryptographicException: Keyset does not exist


at CryptoPro.Sharpei.CPUtils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer)
at CryptoPro.Sharpei.CPUtils.GetKeyPairHelper(CPCspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandleCP& safeProvHandle, SafeKeyHandleCP& safeKeyHandle)
at CryptoPro.Sharpei.Gost3410CryptoServiceProvider.GetKeyPair()
at CryptoPro.Sharpei.Gost3410CryptoServiceProvider..ctor(CspParameters parameters)
at CryptoPro.Sharpei.NetDetours.CPX509Certificate2.get_PrivateKey()
at System.ServiceModel.Security.SecurityUtils.EnsureCertificateCanDoKeyExchange(X509Certificate2 certificate)
--- End of inner exception stack trace ---
at System.ServiceModel.Security.SecurityUtils.EnsureCertificateCanDoKeyExchange(X509Certificate2 certificate)
at CryptoPro.Sharpei.ServiceModel.CPSecurityUtils.EnsureCertificateCanDoKeyExchange(X509Certificate2 certificate)
at System.ServiceModel.Security.ServiceCredentialsSecurityTokenManager.CreateServerX509TokenProvider()
at System.ServiceModel.Security.ServiceCredentialsSecurityTokenManager.CreateLocalSecurityTokenProvider(RecipientServiceModelSecurityTokenRequirement recipientRequirement)
at System.ServiceModel.Security.ServiceCredentialsSecurityTokenManager.CreateSecurityTokenProvider(SecurityTokenRequirement requirement)
at System.ServiceModel.Security.SecuritySessionSecurityTokenAuthenticator.SessionRenewSecurityTokenManager.CreateSecurityTokenProvider(SecurityTokenRequirement requirement)
at System.ServiceModel.Security.SymmetricSecurityProtocolFactory.OnOpen(TimeSpan timeout)
at System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
at System.ServiceModel.Security.SecurityListenerSettingsLifetimeManager.Open(TimeSpan timeout)
at System.ServiceModel.Channels.SecurityChannelListener`1.OnOpen(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
at System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
at System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout)
at CryptoPro.Sharpei.ServiceModel.CPServiceHostBase.OnOpen(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
at System.ServiceModel.Security.SecuritySessionSecurityTokenAuthenticator.OnOpen(TimeSpan timeout)
at System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
at System.ServiceModel.Security.CommunicationObjectSecurityTokenAuthenticator.Open(TimeSpan timeout)
at System.ServiceModel.Security.SecuritySessionServerSettings.OnOpen(TimeSpan timeout)
at System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
at System.ServiceModel.Security.SecurityListenerSettingsLifetimeManager.Open(TimeSpan timeout)
at System.ServiceModel.Channels.SecurityChannelListener`1.OnOpen(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
at System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
at System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout)
at CryptoPro.Sharpei.ServiceModel.CPServiceHostBase.OnOpen(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open()
at System.ServiceModel.ServiceHostingEnvironment.HostingManager.ActivateService(String normalizedVirtualPath)
at System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath)
--- End of inner exception stack trace ---
at System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath)
at System.ServiceModel.ServiceHostingEnvironment.EnsureServiceAvailableFast(String relativeVirtualPath)
Offline Андрей Писарев  
#2 Оставлено : 27 июня 2016 г. 18:11:03(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 9,054
Мужчина
Российская Федерация

Сказал «Спасибо»: 333 раз
Поблагодарили: 1302 раз в 1017 постах
Автор: kmi Перейти к цитате
Для подписи данных используется КриптоПро CSP 3.6.6497 КС1 3.6.5359 в сочетании с КриптоПро .NET Server 1.0.4863.0

Контейнер, список отзыва и сертификат установлены. Тестирование через оснастку КриптоПро CSP проходит корректно. На локальном месте разработчика с тем же сертификатом на IIS Express приложение работает корректно. Однако при развёртывании ASP.NET приложения на IIS 7 и на сервере, и на том же локальном месте разработчика возникает ошибка, указанная ниже. С чем может быть связана эта ошибка?


Здравствуйте.

Каким образом был установлен сертификат?
При тестировании выбираете сертификат, установленный в локальное хранилище компьютера?
Про права на доступ к контейнеру:
Использование секретных ключей в службах Windows
Техническую поддержку оказываем тут
Наша база знаний
Offline kmi  
#3 Оставлено : 28 июня 2016 г. 9:39:13(UTC)
kmi

Статус: Активный участник

Группы: Участники
Зарегистрирован: 18.12.2012(UTC)
Сообщений: 49
Откуда: Москва

Сказал(а) «Спасибо»: 8 раз
Контейнер был установлен в реестре с внешнего накопителя через оснастку КриптоПро CSP. Сертификат был установлен из этого контейнера в реестр. И контейнер, и сертификат устанавливались для локальной машины.

При тестировании выбираю контейнер для локальной машины.
Offline kmi  
#4 Оставлено : 30 июня 2016 г. 11:40:29(UTC)
kmi

Статус: Активный участник

Группы: Участники
Зарегистрирован: 18.12.2012(UTC)
Сообщений: 49
Откуда: Москва

Сказал(а) «Спасибо»: 8 раз
Уточнение

Работа с подписью у нас в коде состоит из нескольких стадий:

  1. поиск сертификата по серийному номеру;
  2. определение провайдера для доступа к контейнеру закрытого ключа;
  3. доступ к закрытому ключу и подписание данных.


Ломается на 2-м шаге.

Поиск сертификата выполняется так:

Код:

X509Store store = new X509Store(aStoreName, aStoreLocation); // параметры задаются в конфигурации
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
X509Certificate2Collection certColl = store.Certificates.Find(X509FindType.FindBySerialNumber, aSerial, false); // серийный номер задан в конфигурации
if (certColl.Count > 0)
{
   return certColl[0];
}


Этот код находит сертификат всегда. Возвращается экземпляр класса System.Security.Cryptography.X509Certificates.X509Certificate2.

Но если код выполняется на IIS, то при обращении к свойству PrivateKey полученного экземпляра возбуждается исключение System.Security.Cryptography.CryptographicException. Т.е. провайдер не определён.

Тот же код, выполняемый на IIS Express, при обращении к PrivateKey возвращает CryptoPro.Sharpei.Gost3410CryptoServiceProvider, и подпись создаётся корректно.

С чем может быть связано такое поведение?

P.S. Тестирование выполнения кода на IIS и IIS Express проводилось на одной и той же машине, контейнер PK (и сертификат) один и тот же в обоих случаях.

Отредактировано пользователем 30 июня 2016 г. 13:53:49(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#5 Оставлено : 30 июня 2016 г. 14:04:42(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 5,886
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 17 раз
Поблагодарили: 577 раз в 519 постах
Читали статью в FAQ? Какой пользователь в IIS?
Знания в базе знаний, поддержка в техподдержке
Offline kmi  
#6 Оставлено : 30 июня 2016 г. 14:46:45(UTC)
kmi

Статус: Активный участник

Группы: Участники
Зарегистрирован: 18.12.2012(UTC)
Сообщений: 49
Откуда: Москва

Сказал(а) «Спасибо»: 8 раз
Автор: maxdm Перейти к цитате
Читали статью в FAQ? Какой пользователь в IIS?


В дополнительных настройках пула стоит Identity = ApplicationPoolIdentity и LoadUserProfile = true.

При попытке указать пользователя в окне управления доступом к закрытому ключу возникает ошибка: "The following object is not from domain listed in the Select Location dialog box? and is therefore not valid: IIS AppPool\ASP.NET v4.0", хотя поиск идёт по локальной машине.

Цитата:
Также необходимо убедиться, что сертификат установлен с привязкой к контейнеру локального компьютера: в панели КриптоПро CSP в мастере тестирования контейнера при отображении ссылки на ключ должен быть виден флаг CRYPT_MACHINE_KEYSET


Не совсем понял, где это смотреть. Запустил КриптоПро CSP, перешёл на вкладку Сервис, нажал "Протестировать", выбрал контейнер для локальной машины. Результаты проверки ссылки на ключ не содержат. Но "проверка завершена успешно, ошибок не обнаружено".

Отредактировано пользователем 30 июня 2016 г. 14:55:41(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#7 Оставлено : 30 июня 2016 г. 15:11:18(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 5,886
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 17 раз
Поблагодарили: 577 раз в 519 постах
У Вас очень старая версия CSP - там нет функциональности по отображению ссылки на ключ.
Вместо ASP.NET v4.0 нужно подставить точное название пула.
Знания в базе знаний, поддержка в техподдержке
Offline kmi  
#8 Оставлено : 30 июня 2016 г. 15:33:14(UTC)
kmi

Статус: Активный участник

Группы: Участники
Зарегистрирован: 18.12.2012(UTC)
Сообщений: 49
Откуда: Москва

Сказал(а) «Спасибо»: 8 раз
Автор: maxdm Перейти к цитате
У Вас очень старая версия CSP - там нет функциональности по отображению ссылки на ключ.
Вместо ASP.NET v4.0 нужно подставить точное название пула.


Такая версия стоит у заказчика. Пока её замена затруднительна.

ASP.NET v4.0 - название пула. Но даже DefaultAppPool тоже не виден.
Offline Максим Коллегин  
#9 Оставлено : 30 июня 2016 г. 17:05:02(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 5,886
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 17 раз
Поблагодарили: 577 раз в 519 постах
Разбирайтесь с учетной записью. Можно поставить System в свойствах пула.
Знания в базе знаний, поддержка в техподдержке
Offline Агаширинов С. А.  
#10 Оставлено : 16 марта 2020 г. 11:09:55(UTC)
Агаширинов С. А.

Статус: Новичок

Группы: Участники
Зарегистрирован: 25.02.2020(UTC)
Сообщений: 9
Российская Федерация

Сказал(а) «Спасибо»: 1 раз
Доброго времени суток! Аналогичная проблема. Выше описанное пробовал не помогло.

Характеристики сервера клиента
ОС: Windows Server Standart 2016
Крипто ПРО:
версия продукта 4.0.9.9963
версия ядра СКЗИ 4.0.9019 КС1.
ЭЦП установлено в реестр. Сертификат установлен для компьютера.

Имеется сервис на WCF, хостится на службе виндовс. Сервис запускается от имени машины.

При вызове метода сервиса, сервис должен подписывает pdf файлы и возвращает их.
Файлы подписываются утилитой cppdfutil.exe.
Запускается утилита из программы таким образом
Process cpPdfUtil = Process.Start(utilFilePath, args);

При попытке подписать файл утилита завершает работу следующей ошибкой:
Документ не подписан: Operation failed. Не удалось получить доступ к контейнеру с закрытым ключом.---[0x80090016]Keyset does not exist

При запуске утилиты из командной строки утилита отрабатывает без проблем.

Во время разработки я тестировал на сервере Windows Server 2012 R2 Standart и там все работало.

И еще момент, у клиента один диск - системный.
Помогите с проблемой. Куда копать?
Offline Агаширинов С. А.  
#11 Оставлено : 16 марта 2020 г. 13:48:32(UTC)
Агаширинов С. А.

Статус: Новичок

Группы: Участники
Зарегистрирован: 25.02.2020(UTC)
Сообщений: 9
Российская Федерация

Сказал(а) «Спасибо»: 1 раз
Автор: Агаширинов С. А. Перейти к цитате
Доброго времени суток! Аналогичная проблема. Выше описанное пробовал не помогло.

Характеристики сервера клиента
ОС: Windows Server Standart 2016
Крипто ПРО:
версия продукта 4.0.9.9963
версия ядра СКЗИ 4.0.9019 КС1.
ЭЦП установлено в реестр. Сертификат установлен для компьютера.

Имеется сервис на WCF, хостится на службе виндовс. Сервис запускается от имени машины.

При вызове метода сервиса, сервис должен подписывает pdf файлы и возвращает их.
Файлы подписываются утилитой cppdfutil.exe.
Запускается утилита из программы таким образом
Process cpPdfUtil = Process.Start(utilFilePath, args);

При попытке подписать файл утилита завершает работу следующей ошибкой:
Документ не подписан: Operation failed. Не удалось получить доступ к контейнеру с закрытым ключом.---[0x80090016]Keyset does not exist

При запуске утилиты из командной строки утилита отрабатывает без проблем.

Во время разработки я тестировал на сервере Windows Server 2012 R2 Standart и там все работало.

И еще момент, у клиента один диск - системный.
Помогите с проблемой. Куда копать?


Решил проблему следующим способом:
1. В службах настроил запуск службы от имени админа
2. отключил UAC
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.