ЭЦП на сервере

1. avd74 5 04.08.26 09:18 Сейчас в теме +2 $m
1С сервер на wIn server 2022. ЗУП 3.1.38.18
На сервере активировал серверную криптопро. Подцепил юзеру usr1cv8 контейнер, установил сертификат.
На клиенте тестирую сертификат - всё ОК локально и всё ОК на сервере (см. скр1)
Удаляю локальный сертификат - не работает. (скр2)
Это так и задумано? Без локального сертификата не работает серверный? Или я что-то делаю не так?
Идея была в том, чтобы несколько клиентов юзали сертификат на сервере...
Прикрепленные файлы:
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. paramedic 04.08.26 11:29 Сейчас в теме
У вас юзеры работают на сервере по РДП или через тонкого клиента локально?
Если через тонкого клиента, то как они могут подписывать, если вы у них на компах грохнули сертификат?
Если через РДП, то как они подпишут, если в их учетке этого сертификата нет?
YA_514896950; +1 Ответить
3. avd74 5 04.08.26 11:42 Сейчас в теме
(2) Юзеры работают через тонкий клиент.
Если всё так, как Вы говорите, то в чём тогда смысл функционала "Подписывать на сервере"/"Проверять сертификаты на сервере" (см. скрин)
Прикрепленные файлы:
YA_514896950; +1 Ответить
4. paramedic 04.08.26 12:15 Сейчас в теме
А сам контейнер с закрытым ключом на сервер перетащили? Или пытаетесь использовать флешку?
Контейнер из-под USR1CV8 доступен?
5. avd74 5 04.08.26 12:24 Сейчас в теме
(4) Да. Конечно. Я писал в стартовом посте. На сервере под юзером, от имени которого агент работает, всё работает. На клиенте тест сертификата на сервере (вторая колонка в результатах теста) тоже проходит. НО! Только при наличии локального сертификата.
А ну и да. Контейнер в реестре и на сервере и локально
6. paramedic 04.08.26 12:35 Сейчас в теме
(5) А подключение случаем не через публикацию идет?
7. avd74 5 04.08.26 12:52 Сейчас в теме
(6) Нене. Вебсервер вообще не поднят
8. nedomolkov.ivan 104 05.08.26 08:17 Сейчас в теме
(1)(5) Стоит развести два слоя, у вас они слиплись в один.

Слой первый — платформа и КриптоПро: где лежит закрытый ключ и кто его видит. Слой второй — БСП: какой сертификат она вообще готова показать пользователю. Флаги «Подписывать на сервере» и «Проверять на сервере» живут в первом слое, они меняют место вычисления подписи. Но список сертификатов БСП собирает по отпечаткам из ЛОКАЛЬНОГО хранилища сеанса — удалили локальный, и находить стало нечего, хотя на сервере всё цело. Ваша картина ложится на это ровно.

Решающий тест, две минуты. Внешняя обработка, запуск из сеанса обычного пользователя при пустом локальном хранилище:

&НаСервере
Функция СертификатыСервера()
Возврат ПолучитьСертификатыХранилищаСертификатов(ТипХранилищаСертификатов.ПерсональныеСертификаты);
КонецФункции

Вернулся ваш сертификат — серверная часть здорова, чинить надо видимость на клиенте, а не КриптоПро. Вернулся пустой список — смотреть, под какой учёткой реально крутится rphost, а не ragent: контейнеры и привязки КриптоПро лежат в HKLM\SOFTWARE\Crypto Pro\Settings\Users\<SID>\Keys (на x64 бывает в Wow6432Node), и персональное хранилище чужого пользователя рабочий процесс не увидит.

Под вашу задачу «несколько клиентов используют ключ на сервере» рабочий вариант такой: раздайте клиентам сам сертификат БЕЗ закрытого ключа — экспорт в .cer и установка в личное хранилище каждого пользователя. Открытая часть секретом не является, закрытый ключ остаётся только на сервере, подпись считается там же. БСП сертификат увидит и предложит, а ключ никуда не разъедется.

Смысл серверного подписания при этом не в раздаче ключей клиентам, а в работе без интерактивного пользователя: регламентные задания, обмен ЭДО, автоподписание — там локального хранилища нет в принципе.

Граница честности: проверял на 8.3.24 и конфигурациях на БСП 3.1, на ЗУП 3.1.38 конкретно не гонял. Если поведение разойдётся — напишите, что вернул тест выше, разберём.
VyacheslavShilov; +1 Ответить
9. avd74 5 05.08.26 09:16 Сейчас в теме
(8) Функции ПолучитьСертификатыХранилищаСертификатов в ЗУП нет
Rphost как и ragent крутится под usr1cv8. ЗУП на сервере и от имени usr1cv8 запускал. И (для чистоты эксперимента) заходил на сервер как usr1cv8. Сертификат проверяется. Всё подписывается и расшифровывается
Локально снёс контейнер. Поставил только сертификат. Результат на скрине. Судя по скрину, запоротые локально этапы проверки на сервере проходят.
В моём понимании, этап проверки должен быть успешен если он успешен локально OR на сервере. А по факту успех только если AND
Прикрепленные файлы:
10. nedomolkov.ivan 104 05.08.26 11:17 Сейчас в теме
(9) Сначала про мою ошибку: глобальной функции ПолучитьСертификатыХранилищаСертификатов в платформе нет, я назвал метод по памяти неверно. Искать его в дереве ЗУП действительно бесполезно — это не объект конфигурации. Правильно так:

&НаСервере
Функция СертификатыСервера()
    Менеджер = Новый МенеджерКриптографии(ИмяПровайдера, "", ТипПровайдера);
    Хранилище = Менеджер.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты);
    Возврат Хранилище.ПолучитьВсе();
КонецФункции


Для КриптоПро ГОСТ Р 34.10-2012 (256 бит) тип провайдера 80, имя — Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider. Запуск из внешней обработки в сеансе обычного пользователя покажет ровно то, что видит rphost, без примеси клиентского хранилища.

Теперь про AND вместо OR. Это не дефект, а устройство механизма. Сертификат сначала надо НАЙТИ, и ищет его БСП по отпечатку в хранилище КЛИЕНТСКОГО сеанса — из этого списка вы выбираете подпись. Флаги серверного подписания и проверки переносят вычисление, а не поиск. Отсюда и связка «и-и»: клиент отвечает за «сертификат видно», сервер — за «ключом есть чем воспользоваться».

Практический вывод тот же, что в (8), и вы его уже наполовину сделали: на клиентах должен лежать сам сертификат — открытая часть, .cer, без контейнера. Осталось проверить главное, что снимет спор: в этом состоянии реальное подписание документа в ЗУП проходит или нет? Форма проверки сертификата гоняет диагностику обеих сред сразу, и красный крест в клиентской колонке при ключе только на сервере ожидаем — локально подписывать нечем по определению. Если документ при этом подписывается, у вас всё уже работает, а крест надо читать как «закрытого ключа на клиенте нет», а не как отказ.

Если не подписывается — напишите, на каком шаге падает и с каким текстом ошибки, разберём дальше.

Граница честности прежняя: 8.3.24 и БСП 3.1, на ЗУП 3.1.38 конкретно не гонял.
11. avd74 5 05.08.26 12:46 Сейчас в теме
(10) Вот такую вот конструкцию зацепил:
Функция СертификатыНаСервере()
	
	Если Не ЭлектроннаяПодпись.СоздаватьЭлектронныеПодписиНаСервере() Тогда
		Возврат Неопределено;
	КонецЕсли;

	МенеджерКриптографии = ЭлектроннаяПодпись.МенеджерКриптографии("", Ложь);
	
	Если МенеджерКриптографии = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	ХранилищеСертификатовКриптографии = МенеджерКриптографии.ПолучитьХранилищеСертификатов(
		ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты);
	
	МассивСертификатов = ХранилищеСертификатовКриптографии.ПолучитьВсе();
	
	СписокВозврата = Новый СписокЗначений();
	ТекущаяДатаСеанса = ТекущаяДатаСеанса();
	
	Для Каждого Сертификат Из МассивСертификатов Цикл
		Если Сертификат.ДатаОкончания < ТекущаяДатаСеанса Тогда
			Продолжить;
		КонецЕсли;
		
		ПредставлениеСертификата = ЭлектроннаяПодпись.ПредставлениеСертификата(Сертификат);
		Если Сертификат.Субъект.Свойство("O") И ЗначениеЗаполнено(Сертификат.Субъект.O) Тогда
			ПредставлениеСертификата = ПредставлениеСертификата + " (" + Сертификат.Субъект.O + ")";
		КонецЕсли;		
		ОтпечатокСертификата = Base64Строка(Сертификат.Отпечаток);
		СписокВозврата.Добавить(ОтпечатокСертификата, ПредставлениеСертификата);
	КонецЦикла;
	
	Возврат СписокВозврата;
	
КонецФункции

Показать

Запустил на клиенте, предварительно убив локальный контейнер вместе с сертификатом. Возвращает сертификат, установленный на сервере. Т.е. с клиента он виден и доступен.
Крч я прихожу к выводу, что, по крайней мере в контексте ЗУП (СЭДО итп), закрытый ключ, установленный на сервере, никакой роли не играет.
Мне представлялось так: добавляю ЭЦП в ЗУП - добавляю закрытый ключ на сервер - даю списку юзеров права - по запросу юзеров подпись происходит на сервере
Видимо ошибался (см.скрин)
Прикрепленные файлы:
12. nedomolkov.ivan 104 05.08.26 14:16 Сейчас в теме
(11) Осторожнее с выводом: ПолучитьВсе() по хранилищу личных сертификатов отдаёт только открытую часть. Сертификат остаётся в списке и тогда, когда закрытый ключ недоступен, — «виден с сервера» не равно «можно подписать». Ваш опыт с убитым локальным контейнером ровно это и показывает: вы увидели серверный сертификат, но не проверили доступность его ключа.

Проверяется одним способом — тестовым подписанием в серверном контексте:

Код
&НаСервере
Функция ТестПодписи(Сертификат)
   МенеджерКриптографии = ЭлектроннаяПодпись.МенеджерКриптографии("", Ложь);
   Попытка
      Подпись = МенеджерКриптографии.Подписать(ПолучитьДвоичныеДанныеИзСтроки("test"), Сертификат);
      Возврат "ОК, " + Подпись.Размер() + " байт";
   Исключение
      Возврат ОписаниеОшибки();
   КонецПопытки;
КонецФункции
Показать полностью


Дальше два типовых расклада.

1. Контейнер закрытого ключа лежит в профиле того, кто его ставил, а серверный криптоменеджер работает от учётной записи службы «Агент сервера 1С». Сертификат в LocalMachine виден всем, контейнер в профиле — только своему пользователю. Отсюда классическое «на сервере всё установлено, а подписи нет». Лечится установкой контейнера под учёткой службы либо переносом ключа в реестр компьютера средствами КриптоПро.

2. Флаг «Подписывать на сервере» сам по себе подписание не переносит: паролю закрытого ключа взяться неоткуда, а спросить его можно только у клиента. Пока пароль не сохранён в карточке сертификата, интерактивное подписание уходит на клиент — и серверный ключ действительно простаивает, как вы и наблюдаете.

У вас операция не идёт вовсе или идёт, но с запросом пароля? В регламентном задании клиента нет физически — там серверный ключ обязателен, и по симптому сразу видно, какой из двух случаев ваш.
13. avd74 5 05.08.26 16:11 Сейчас в теме
(12) Да всё нормально было настроено изначально. На момент стартового поста. Беда именно в контексте ЗУП. Тут ЭЦП используется для взаимодействия с контролирующими органами в основном. Настройки взаимодействия из 1С-Отчётности тянутся. Способа подтянуть туда сертификат с сервера я не нашёл
14. nedomolkov.ivan 104 05.08.26 16:15 Сейчас в теме
(13) Тогда это уже не про криптографию, а про то, как БСП заводит сертификат в справочник. Мастер добавления работает с клиента и показывает только то, что видно в клиентском хранилище, — серверный сертификат в этот список не попадает по построению. Вы его там и не найдёте, сколько ни ищите.

Обход — добавлять не «из установленных на компьютере», а из файла: выгрузить открытую часть серверного сертификата в .cer и завести запись по нему. В справочнике всё равно хранится только открытая часть и отпечаток, а закрытый ключ ищется в момент подписания — в том хранилище, где операция физически выполняется. Дальше включается подписание на сервере и сохраняется пароль закрытого ключа, иначе БСП снова пойдёт спрашивать его у клиента, и мы вернёмся к тому же месту.

Граница честная: именно связку ЗУП + 1С-Отчётность я сам не собирал, у нас это было на стороне ЭДО. Если в вашей версии форма добавления сертификата варианта «из файла» не предлагает — напишите версию БСП, посмотрю, чем его там заменили.
15. avd74 5 05.08.26 16:41 Сейчас в теме
(14) У меня на том же сервере БП стоит. Та же самая картинка. Благо там не надо много юзеров у подписи.
Т.е. как только на сцену выходит 1С-Отчётность - ЭЦП на сервере отдыхает. Так вижу)
16. nedomolkov.ivan 104 05.08.26 17:11 Сейчас в теме
(15) Для интерактивной работы вывод верный: 1С-Отчётность заводит сертификат своим мастером из клиентского хранилища, и серверный ключ в этой ветке действительно не участвует.

Совсем «отдыхать» он всё же не будет. Автоотправка отчётности и ответы на требования по расписанию идут регламентным заданием, где клиента нет физически — подпись там считается на сервере, и контейнер под учёткой службы обязателен. Настроенное вами пригодится, просто в другом сценарии.

А исходную задачу «один сертификат на несколько пользователей без плясок с контейнерами» в чистом виде решает не серверный контейнер, а облачная подпись: DSS-модель в БСП либо облачный сертификат от самого оператора 1С-Отчётности. Ключ живёт в сервисе, на клиентах не нужно ни контейнера, ни установленного криптопровайдера, а раздача .cer по рабочим местам отпадает как класс.

Граница честности прежняя: DSS я собирал на ЭДО, связку именно с 1С-Отчётностью не делал — уточните у оператора, поддерживает ли ваш тариф облачный сертификат.
17. YA_514896950 38 06.08.26 08:50 Сейчас в теме
(16) вы знаете как формировать чисто в 1с подпись с произвольными аттрибутами?
мне надо капикомовский аттрибут имени документа впиндюрить. не охота внешнюю компоненту ставить
в принципе 1с делает какю надо подпись но без этого аттрибута. и сайт налоговой не принимает эту подпись для авторизации(

я пишу заменитель 1с отчетности чтоб отправлять на сайт налоговой прям из 1с минуя 1с отчетность.
ну у налоговой есть сервис приема свой.
18. nedomolkov.ivan 104 06.08.26 16:20 Сейчас в теме
(17) Из чистой 1С - нет, и дело не в версии платформы. МенеджерКриптографии собирает CMS сам, набор подписанных атрибутов у него зашит: contentType, messageDigest, signingTime, для CAdES-BES ещё signingCertificateV2. Точки, куда подсунуть свой атрибут, во встроенном языке нет. Собрать SignedAttributes руками тоже не получится: подписать готовый хэш платформа не умеет, она всегда хэширует то, что вы ей передали.

Обходы, если под внешней компонентой вы понимаете именно ВК с подключением в 1С:
- cryptcp или csptest из состава КриптоПро через КомандаСистемы. Обычный exe, регистрировать в базе нечего, из фонового задания на сервере работает.
- CAdESCOM, COM-объект того же КриптоПро. Формально не ВК, но зависимость на машине ровно та же.

И встречный вопрос, он может снять всю задачу. Вы уверены, что не принимают именно из-за documentName? У CAPICOM это атрибут 1.3.6.1.4.1.311.88.2.1, и приёмники его почти нигде не проверяют, он для человека, а не для проверки. Личный кабинет ФНС гораздо чаще отбивает подпись по другим причинам: прислали простой CMS вместо CAdES-BES, отсоединённую вместо присоединённой, или base64 завёрнут не так. Что конкретно отвечает их сервис?
YA_514896950; +1 Ответить
19. YA_514896950 38 06.08.26 19:07 Сейчас в теме
(18) ну происходит ошибка ответ типа неверное содержимое, я помню тогда сравнивал прям бинарники подписей. Естественно форматы совпадали, но парсер структуры подписей выдал отличие только в одном. Подпись которая проходит имеет аттрибут DocumentName. И я нашел джиэс код на сайте где есть указание включать этот аттрибут.
Даже были мысли попробовать собирать подпись вручную)))) но пока забросил.
20. YA_514896950 38 06.08.26 19:15 Сейчас в теме
То есть да. Сайт через капотом формируется подпись с атрибутом 1.3.6.1.4.1.311.88.2.1 который имеет значение просто DocName и видимо используется как флаг чтобы отсечь таких умников которые пытаются отправлять не через веб интерфейс сайта
Для отправки сообщения требуется регистрация/авторизация

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот