Статус: Активный участник
Группы: Участники
Зарегистрирован: 13.04.2012(UTC) Сообщений: 109
|
Добрый день! Возникла следующая проблема. Есть WCF-сервис, который работает с сертификатами. Сертификаты установлены на e-Token. То есть сам сертификат в реестре в LocalComputer, а закрытый ключ на токене. Если я запускаю серис в Visual Studio локально, то все работает нормально. Но если я публикую сервис в IIS, то нет доступа к закрытому ключу на токене. Сервис работает в IIS в пуле под моим пользователем. Ошибка происходит в методе, написанном по вашему примеру программной установки пароля для закрытого ключа. Код:
public X509Certificate2 SetPasswordToCertificate(X509Certificate2 baseCertificate, string password)
{
X509Certificate2 passwordCertificate = baseCertificate;
Gost3410CryptoServiceProvider keyProvider = (Gost3410CryptoServiceProvider)baseCertificate.PrivateKey;
if (keyProvider != null)
{
CspKeyContainerInfo containerInfo = keyProvider.CspKeyContainerInfo;
// копируем параметры csp из исходного контекста сертификата
CspParameters cspParameters = new CspParameters();
cspParameters.KeyContainerName = containerInfo.KeyContainerName;
cspParameters.KeyNumber = (int)containerInfo.KeyNumber;
cspParameters.ProviderName = containerInfo.ProviderName;
cspParameters.ProviderType = containerInfo.ProviderType;
cspParameters.Flags = containerInfo.MachineKeyStore
? (CspProviderFlags.NoPrompt | CspProviderFlags.UseExistingKey | CspProviderFlags.UseMachineKeyStore)
: (CspProviderFlags.NoPrompt | CspProviderFlags.UseExistingKey);
// устанавливаем пароль или пин-код для контейнера закрытого ключа
SecureString keyPassword = new SecureString();
foreach (char passChar in password)
{
keyPassword.AppendChar(passChar);
}
cspParameters.KeyPassword = keyPassword;
// создаем новый контекст сертификата, поскольку исходный открыт readonly
passwordCertificate = new X509Certificate2(baseCertificate.RawData);
// задаем криптопровайдер с установленным паролем
passwordCertificate.PrivateKey = new Gost3410CryptoServiceProvider(cspParameters);
}
return passwordCertificate;
}
Так вот, на первой же строчке, при обращении к закрытому ключу Код:Gost3410CryptoServiceProvider keyProvider = (Gost3410CryptoServiceProvider)baseCertificate.PrivateKey;
воникает exception Цитата: System.Security.Cryptography.CryptographicException Message=The Keyset parameter is invalid. Source=CryptoPro.Sharpei.Base StackTrace: 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.NetDetours.CPX509Certificate2.get_PrivateKey()
Кто-нибудь может подсказать, в чем проблема? Каких прав не хватает сервису, работающему под пользователем под IIS, в отличие от того же сервиса, работающего под тем же пользователем, но локально? Отредактировано пользователем 3 августа 2012 г. 17:06:38(UTC)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Администраторы, Участники Зарегистрирован: 28.04.2010(UTC) Сообщений: 140  Откуда: Крипто-Про Поблагодарили: 15 раз в 14 постах
|
день добрый, в расширенных настройках пула значение свойства "загрузить профиль пользователя" == true ?
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 13.04.2012(UTC) Сообщений: 109
|
khomenko написал:день добрый, в расширенных настройках пула значение свойства "загрузить профиль пользователя" == true ? да
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 01.08.2011(UTC) Сообщений: 674 Откуда: Москва
Сказал(а) «Спасибо»: 9 раз Поблагодарили: 38 раз в 36 постах
|
При публикации сертификата в IIS, когда на закрытом ключе присутствует пароль, необходимо "включить кэширование"(КриптоПро CSP - Безопасность). Протестировать контейнер, и "запомнить пароль" для него. После чего должна запустится.
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 13.04.2012(UTC) Сообщений: 109
|
Да, это помогло, спасибо. Но это обходной способ. Опять же, в некотором роде, безопасность нарушается. А почему доступ к закрытому ключу из под IIS валится, хотя локально работает? Отредактировано пользователем 4 августа 2012 г. 3:26:35(UTC)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 13.04.2012(UTC) Сообщений: 109
|
Благодаря помощи техподдержки Аладдина удалось решить этот вопрос. Решение оказалось в том, что Application Pool для web-приложения должен быть запущен от имени LocalSystem.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close