Доступ к хранилищу сертификатов ЭП из сеанса под IIS #777324


#0 by Gleb K
win2008r2 + 1С 8.3 + IIS Имею http-сервис опубликованный на IIS, необходимо работать с ЭП (проверять подпись запроса и формировать подпись для ответа). Пул приложений 1С в ISS стартует под собственным пользователем IIS APPPOOL 1C. Свой сертификат RSA с закрытым ключом установил в хранилище компьютераличные, дал полные права доступа к нему пользователю IIS APPPOOL 1C (пробовал как через mmc, так и через утилиту winhttpcertcfg). Также пробовал ставить сертификат в хранилище пользователяличные. Следующий код не видит сертификата: МК = Новый МенеджерКриптографии("Microsoft Enhanced Cryptographic Provider v1.0","",1);      Также пробовал стартовать пул приложений 1С под учеткой Network service и под своей личной учеткой - не помагает. Если запустить толстый клиент на этой машине, то сертификат видится без проблем. Ребята, есть идеи?
#1 by Gleb K
Ап.
#2 by igork1966
Полагаю что ветка реестра "хранилище компьютераличные" не видна под другим пользователем, не?
#3 by Gleb K
если имеется в виду HKEY_CURRENT_USERSoftwareMicrosoftSystemCertificates и HKEY_LOCAL_MACHINESOFTWAREMicrosoftSystemCertificates То доступ с наследованием на обе ветки проставил, сертификат все равно не видит.
#4 by Gleb K
Если смотреть через толстый клиент, то текущему пользователю доступно только хранилище пользователя и сертификат виден, а на хранилище компа выдается ошибка, но если на его ветку в реестре добавить права текущему пользователю и поместить туда сертификат, то ошибки не появляется, но ни одного сертификата в этом хранилище не видно. Поставил сертификат в хранилище пользователя, сделал запуск пула приложений от имени текущего пользователя, сертификаты хранилища пользователя все-равно не видны.
#5 by Gleb K
Up
#6 by Aloex
С местом исполнения не ошибся: клиент-сервер?
#7 by Gleb K
http-сервис вроде исполняется на сервере, при этом используются синхронные вызовы методов, так что вроде контекст правильный.
#8 by Aloex
ну а толстый клиент на клиенте работает.
#9 by Gleb K
Да, с толстым все ок.
#10 by Gleb K
Ап
#11 by Gleb K
Попробовал через CAPICOM, он видит сертификаты, но при попытке подписать (последняя строка в коде) валится с ошибкой "Ошибка при вызове метода контекста (Sign): Произошла исключительная ситуация: Набор ключей не существует". Пул приложений 1С сейчас стартует под локальным пользователем. Этот же код, но в толстом клиенте под локальным пользователем работает без проблем. // CAPICOM constants
#12 by Gleb K
Ап
#13 by Gleb K
Попробовал сделать через обертку .Net В толстом клиенте все работает. Из модуля http-сервиса пула приложений запускаемого от этого же пользователя - падает на первой строке как-будто COM интерфейс не зарегистрирован. Интересно это фундаментальные ограничения или какой-то косяк с правами доступа?
#14 by Serginio1
Возможно не зарегистрирован. Там нужно в поставке идет RegAsm.bat который нужно запустить от администратора Внутри %SystemRoot%Microsoft.NETFrameworkv4.0.30319RegAsm.exe  "%~dp0NetObjetToIDispatch45.dll" /codebase
#15 by Serginio1
Ну и  посмотреть настройки пула какой .Net FrameWork использует
#16 by Gleb K
Зарегистрирован батником, в толстом клиенте на этой же машине код полностью отрабатывает. А при запуске через пул приложений IIS на вызов http-сервиса - падает.
#17 by Gleb K
В настройках пула 1С рекомендует ставить Без управляемого кода, но я пробовал ставить 4 Net все-равно падает.
#18 by Serginio1
Там 2 строчки одна для 32 разрядного (Толстый клиент) Вторая для 64 разрядного. Запусти из под cmd
#19 by Gleb K
Запускал cmd под админскими правами и оттуда уже батник. В реестре вроде прописался HKEY_CLASSES_ROOTCLSID{8693BBEC-C964-4478-AFCB-E8D15FD8F4F6}
#20 by Serginio1
Попробуй для проверки из фонового задания запустить
#21 by Gleb K
Пул приложений 32 разрядный.
#22 by Serginio1
Может прав на папку не хватает?
#23 by Gleb K
Папку с dll ? Права полные для текущего пользователя - в толстом клиенте все отрабатывает, через пул приложений под правами того же текущего пользователя - нет.
#24 by Serginio1
Кстати ProgID DFDADA57-B22C-4276-928A-8B91C9891FF1 Посмотри права DCOM
#25 by Gleb K
Спасибо, позже попробую.
#26 by Serginio1
#27 by Gleb K
Это через оснастку Службы компонентовНастройка Dcom ?
#28 by Gleb K
У меня база стартует в файловом режиме.
#29 by Gleb K
Политики попробую попозже.
#30 by Serginio1
#31 by Gleb K
При регистрации он кстати ругался на ключ /codebase но потом написал, что типы успешно зарегистрированы
#32 by Gleb K
У меня в дереве Dcom нет NetObjetToIDispatch45 Дерево смотрю 32 разрядное через mmc comexp.msc /32
#33 by Serginio1
Кстати а в роли от кого запускается 1С стоит галка Automation
#34 by Serginio1
Попробуй установить Привилегированный режим
#35 by Gleb K
Сейчас поставил общие права на объекты Dom и прописал права в локальных политиках, теперь ошибка Отказано в доступе. Но сервер еще не перезагружал.
#36 by Gleb K
Стоит Не помогло Сейчас опять выдает ошибку Класс не зарегистрирован.
#37 by Gleb K
Такой объект тоже зарегистрирован HKEY_CLASSES_ROOTCLSID{DFDADA57-B22C-4276-928A-8B91C9891FF1}
#38 by Serginio1
Такое впечатление, что нет у тебя доступа к реестру.
#39 by Serginio1
#40 by Gleb K
Хочешь прикол? попытка //До сюда код выполняется и в БиблиотекаNET сидит COMОбъект а на следующей строке все падает с ошибкой "Ошибка при вызове метода контекста (СоздатьОбъект): Произошла исключительная ситуация (mscorlib): Адресат вызова создал исключение."
#41 by Serginio1
Посмотри настройки пула
#42 by Serginio1
Попробуй просто ПолучитьТип А сервис запускаешь от g.kondratyev
#43 by Gleb K
Там все вроде ок. Пул идентити сейчас g.kondratyev
#44 by Gleb K
С ПолучитьТип полет нормальный
#45 by Serginio1
Значит проблема доступа к ,"C:Usersg.kondratyevDesktopleaderGKazimut360.pfx", Попробуй просто найти файл Можно создать и так
#46 by Gleb K
На второй строке этот код вызывает исключение.
#47 by Gleb K
Права на файл у g.kondratyev полные
#48 by Serginio1
#49 by Gleb K
Да, вы правы Файл.Существует = Ложь в чем может быть причина?
#50 by Serginio1
Mожет  С русская?
#51 by Gleb K
Путь копипастил с проводника и в толстом клиенте он работает :(
#52 by Gleb K
Переместил файл поближе и перевел в нижний регистр: c:1cbasegk.pfx Теперь файл существует, но при попытке падает: "Ошибка при вызове метода контекста (СоздатьОбъект): Произошла исключительная ситуация (NetObjetToIDispatch45): Ссылка на объект не указывает на экземпляр объекта."
#53 by Gleb K
аа, походу понял косяк
#54 by Gleb K
все-равно падает на последней строке  "Ошибка при вызове метода контекста (СоздатьОбъект): Произошла исключительная ситуация (mscorlib): Адресат вызова создал исключение.""
#55 by Serginio1
#56 by Serginio1
А что, за ошибка?
#57 by Gleb K
#58 by Serginio1
А Сообщить(ОписаниеОшибки);
#59 by Gleb K
Ошибка при вызове метода контекста (СоздатьОбъект): Произошла исключительная ситуация (mscorlib): Адресат вызова создал исключение.
#60 by Serginio1
И все? По идее и
#61 by Serginio1
Попробуй через Import
#62 by Gleb K
Serginio1 огромное спасибо за помощь, попробую импорт завтра, а также через X509Store.
#63 by Serginio1
Для флагов есть OR Например Код на C# new X509Certificate2(fileName, keyPassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable) Код на 1С Сертификат=X509Certificate2(fileName, keyPassword,Врап.OR( X509KeyStorageFlags.MachineKeySet, X509KeyStorageFlags.PersistKeySet, X509KeyStorageFlags.Exportable));
#64 by Serginio1
#65 by Gleb K
Перезагрузил сервер, настройки прав не решили ситуацию.
#66 by Gleb K
Пробую сейчас через хранилище Ошибка при получении значения атрибута контекста (PrivateKey): Неизвестная ошибка System.Reflection.TargetInvocationException: Адресат вызова создал исключение. ---> System.Security.Cryptography.CryptographicException: Не удается найти указанный файл.
#67 by Serginio1
Попробуй 63
#68 by Serginio1
#69 by Gleb K
Хорошая статья, но странно это, т.к. у меня в пуле приложений стоит Загрузить профиль пользователя = True, т.е. с этой настройкой должно работать создание объекта сертификата из файла, но нет. Далее предлагается поместить сертификат в хранилище компа, дать права на него пользователю под которым запускается пул, и достать его из хранилища, что собственно я успешно и делаю, но при обращении к закрытому ключу объекта сертификат получаю грабли.
#70 by Gleb K
Эврика! Рабочим оказался следующий код: Serginio1 огромное спасибо за участие, хотя еще мне нужно сделать проверку подписи входящего запроса, но если будут проблемы напишу сюда и надеюсь не откажите еще раз помочь.
#71 by Serginio1
Посмотри
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С