Служба времени windows 10 в домене

Данная статья рассматривает процесс установки КриптоПро JCP на компьютер под управлением ОС Windows.

Авторизуйтесь под учётной записью с правами администратора и распакуйте ранее загруженный архив jcp-2.0.40502.zip в любую директорию. Найдите в этой директории и запустите файл setup.exe

В открывшемся окне мастера установки КриптоПро JCP выберите язык и нажмите «Далее»:

image001.png

В окне выбора действия укажите «Установить» и нажмите кнопку «Далее»:

image002.png

Прочитайте лицензионное соглашение и примите его условия, нажмите кнопку «Далее»:

image003.png

В окне выбора установленной JRE требуется указать директорию размещения JRE, которую вы планируете использовать при работе КриптоПро JCP. Если ранее вы выполнили установку JRE по умолчанию, как было рекомендовано в посвящённой установке Java статье, то просто оставьте это значение без изменений, как изображено ниже, в противном случае выберете директорию, куда ранее была установлена JRE и нажмите «Далее»:

image004.png

В окне выбора установки компонентов КриптоПро JCP включите флажок «Включить усиленный контроль использования…» в дополнение к уже включенным по умолчанию флажкам и нажмите кнопку «Далее»:

image005.png

Если у вас есть приобретенная лицензия КриптоПро JCP, введите ее серийный номер в окне ввода серийного номера продукта, или оставьте это поле пустым, если планируете приобретение лицензии позже. Нажмите кнопку «Далее»:

image006.png

Еще раз проверьте корректности устанавливаемой конфигурации и нажмите кнопку «Установка»:

image007.png

По окончании установки инсталлятор сообщит вам о завершении процесса, нажмите кнопку «Далее»:

image008.png

В завершающем окне инсталлятора нажмите кнопку «Закрыть»:

image009.png

После закрытия окна инсталлятора откроется окно инициализации усиленного режима контроля использования ключевой информации. Выполняйте произвольные движения мышью и нажатия клавиш в соответствии с подсказками:

image010.png

По завершении процесса инициализации вам откроется окно контрольной панели КриптоПро JCP:

image011.png

Контрольная панель служит для настройки КриптоПро JCP, оставьте ее открытой, она понадобится нам через один шаг.

Установите правильный порядок чередования криптопровайдеров

Откройте файл java.security, расположенный в директории C:\Program Files\Java\jre1.8.0_201\lib\security:

image012.png

Сразу после установки КриптоПро JCP вы увидите такой порядок чередования криптопровайдеров в данном файле:

security.provider.11=ru.CryptoPro.reprov.RevCheck

security.provider.12=ru.CryptoPro.JCP.JCP


security.provider.13=ru.CryptoPro.Crypto.CryptoProvider

Измените порядок чередования в любом текстовом редакторе, запущенном под учётной записью с административными правами, на изображённый ниже:

image013.png

Перенесите ключи электронной подписи в целевую директорию

Архив ключей обычно имеет название, состоящее из произвольных букв/цифр и включает в себя директорию с комплектом файлов с расширением .key:

image014.png

Распакуйте архив с ключами в стандартную директорию ключей КриптоПро JCP C:\Users\%UserName%\AppData\Local\Crypto Pro. Обратите особое внимание, что в архиве содержится директория с ключами. В стандартной директории ключей КриптоПро JCP должна появиться директория, в которой будут размещены ключи. Не следует изменять имя этой директории, оставьте то имя, которое было в архиве.

Пример размещения файлов ключей:

image015.png

Подключите ключи электронной подписи информационной системы Участника

Вернитесь в панель управления КриптоПро JCP и перейдите на вкладку «Хранилища ключей и сертификатов». Откройте хранилище контейнеров «HDImageStore». Если вы делали всё согласно процедуре, описанной в данной статье, то увидите свой контейнер с ключами. После двойного клика на контейнере и ввода пароля подписи вам откроется ключ обмена и сертификат:

image016.png

Возможно, что ваши ключи не защищены паролем, в таком случае в окне ввода пароля выберите пункт «Не задавать пароль»:

Так же необходимо проверить, что открытый ключ добавлен в контейнер. Если нет, то нажмите «Добавить» и выберете файл открытого ключа с расширением .cer.

После подключения ключей настоятельно рекомендуется изменить пароль контейнера. Для этого выделите контейнер и нажмите кнопку «Изменить пароль». Откроется окно «Ввод нового пароля». Введите новый пароль, состоящий минимум из восьми знаков, и нажмите кнопку «ОК»:

image018.png

Теперь криптопровайдер установлен и готов к работе, можно переходить к установке и настройке СУБД.

dmitryp

 


#1
Оставлено
:

2 июля 2019 г. 6:57:28(UTC)

Статус: Участник

Группы: Участники

Зарегистрирован: 11.07.2017(UTC)
Сообщений: 28

Сказал(а) «Спасибо»: 3 раз

Начиная с JCP 2.0.40109-A, все настройки JCP становятся локальными для пользователя:

Цитата:

все настройки хранятся в разделе Java Preferences пользователя user, а не system

Это усложняет использование JCP в Windows-службах — т.к. контрольную панель JCP (далее КП) нужно запускать из-под той учётной записи (УЗ), под которой будет работать служба. Пока что вижу следующие пути:
1. Устанавливать службу под обычной учётной записью. Это усложняет установку (т.к. нужно вводить пароль), и ведёт к уязвимостям (т.к. проще всего запускать КП из под той же УЗ, из-под которой производится администрирование).
1. Устанавливать службу под LocalService. КП в таком случае можно запускать через psexec. Плюс такой реализации — её достаточно просто добавить в инсталлятор. Пока что наиболее удобный вариант.
1. Устанавливать службу под виртуальной УЗ (NT Service\Foo), запускать КП из под какой-то другой (даже psexec не умеет запускать приложения из-под виртуальных УЗ), и переносить настройки между УЗ средствами работы с реестром. Технически, наверное, реализуемо, но не стоит полученных проблем.

Скажите, пожалуйста — планируете ли вы как-то поддерживать работу с виртуальными УЗ? Рассматриваете ли возвращение глобальных настроек в каком-то виде?

Отредактировано пользователем 2 июля 2019 г. 7:08:22(UTC)
 | Причина: Не указана

two_oceans

 


#2
Оставлено
:

2 июля 2019 г. 7:34:42(UTC)

Статус: Эксперт

Группы: Участники

Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602

Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 396 раз в 366 постах

Насколько помню есть возможность запустить программы (но наверно не службы) от имени самой системы в интерактивном режиме (с видимым интерфейсом). КП не пробовал, а вот regedit помню запускал в Семерке и смотрел разделы реестра вроде SAM, которые не видны администраторам. Точную процедуру не помню, вроде тоже через psexec. Поэтому чисто теоретически возможно обойтись без всяких других учетных записей.

dmitryp

 


#3
Оставлено
:

2 июля 2019 г. 7:43:38(UTC)

Статус: Участник

Группы: Участники

Зарегистрирован: 11.07.2017(UTC)
Сообщений: 28

Сказал(а) «Спасибо»: 3 раз

two_oceans, «от имени самой системы» — это, видимо, от LocalSystem? Это то же самое что второй вариант, но лучше бы LocalSystem для служб не использовать.

Запускать приложения от LocalService точно возможно (запускал КП через psexec) — для LocalSystem должно быть то же самое. Но настройки в любом случае будут локальными для конкретной УЗ (т.е. для LocalSystem/LocalService).

Elvira Borodina

 


#4
Оставлено
:

10 июля 2019 г. 10:44:26(UTC)

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

Группы: Участники

Зарегистрирован: 24.04.2018(UTC)
Сообщений: 24

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 9 раз в 6 постах

Добрый день!
Настройки JCP сделаны локальными для удобства пользователей.
В ранних версиях (java 8 и ниже) необходимо было производить установку провайдера (под root-ом), в процессе которой также прописывались все настройки.
Теперь же (для java 10 и выше) установка провайдера не нужна — достаточно просто скопировать себе файлы и запустить, прописав правильно classpath. Поэтому теперь все настройки прописываются при первом запуске провайдера. Для того, чтобы не требовать от клиентов в обязательном порядке производить первый запуск по root-ом (далеко не всем это удобно), решено было сделать настройки локальными.

Мы обсудили Вашу проблему. Пока мы не планировали возвращение глобальных настроек. Но если данная проблема будет актуальной (и трудно решаемой) в дальнейшем, мы предоставим её решение в будущих релизах.

Пользователи, просматривающие эту тему

Guest

Быстрый переход
 

Вы не можете создавать новые темы в этом форуме.

Вы не можете отвечать в этом форуме.

Вы не можете удалять Ваши сообщения в этом форуме.

Вы не можете редактировать Ваши сообщения в этом форуме.

Вы не можете создавать опросы в этом форуме.

Вы не можете голосовать в этом форуме.

Прочитано: 39 769

Задача: разобрать действия по организации сервиса времени для всей локальной сети дабы рабочие станции, сервера получали точное время и оно везде было одинаковым. Сервис времени организовывается на домен контроллере под управлением операционной системы Windows Server 2012 R2, также действия ниже аналогичны и для Server 2008 R2

Схема: интернет — Mikrotik — DC – Workstations

Открываю на srv-dc консоль командной строки с правами администратора:

Win + X — Command Prompt (Admin)

Определяю какой домен контроллер (Windows Server 2012 R2 Std) имеет роль PDC если домен контроллеров несколько в домене:

C:\Windows\system32>netdom query fsmo
Schema master srv-dc.polygon.local
Domain naming master srv-dc.polygon.local
PDC srv-dc.polygon.local
RID pool manager srv-dc.polygon.local
Infrastructure master srv-dc.polygon.local
The command completed successfully.

Как видно из вывода, это контроллер домена srv-dc.polygon.local, подключаюсь теперь к нему по RDP или VNC соединению для выполнения следующих команд:

C:\Windows\system32>net stop w32time

Настраиваем внешний источник времени:

C:\Windows\system32>w32tm /config /syncfromflags:manual /manualpeerlist:"0.pool.ntp.org"

Cделать ваш контроллер домена PDC доступным для клиентов:

C:\Windows\system32>w32tm /config /reliable:yes

Запускаю службу времени:

C:\Windows\system32>net start w32time

Также можно изменения вносить и через реестр в ключе: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters

Чтобы после принудительно запросить получение точного времени проделываем:

C:\Windows\system32>W32tm /config /reliable:yes

The command completed successfully.

C:\Windows\system32>W32tm /config /update

The command completed successfully.

C:\Windows\system32>W32tm /resync

Sending resync command to local computer

The command completed successfully.

Вот и все, служба времени Windows начинает синхронизацию времени с внешним источником, посмотреть этот процесс можно так:

C:\Windows\system32>w32tm /query /configuration

После нужно добавить параметр в DHCP оснастку, что сервер времени это наш домен контроллер:

Win + X — Control Panel — Administrative Tools — запускаю оснастку DHCP: DHCP → srv-dc.polygon.local → IPv4 → Scope [10.10.10.0] local → и через правый клик мышью по Scope Options вызываю меню Configure Options… где добавляю опцию для всего домена: 042 NTP Servers

Теперь доменные Windows станции будут знать, что сервер времени это домен контроллер, а для моих Ubuntu системы после установке sudo apt-get install ntp -y в файле /etc/ntp.conf нужно будет в параметре server указать IP адрес этого домен контроллера и перезапустить службу времени sudo service ntp restart.

Если же у Вас DHCP сервис развернут не на Windows, то донести до всех где брать точное время можно через групповые политики GPO. Создаем GPO_NTP и предопределяем, что ориентирована она будет на текущий домен и все рабочие станции посредством WMI-фильтра.

Открываю оснастку на srv-dc управления групповыми политиками домена:

Win + X — Control Panel — Administrative Tools — Group Policy Management, открываю на редактирование: Group Policy Management → Forest: polygon.local → Domains → polygon.local → и через правый клик мышью по WMI Filters вызываю меню New…

  • Name: W7
  • Decription: Windows 7 x86/x64
  • Queries:Add
  • Namespace: root\CIMv2
  • Query: Select
    * from WIN32_OperatingSystem where ((Version > "6") and
    (ProductType = 1))

и
нажимаю OK, OK, Save

После перехожу к редактированию групповой политики для рабочих станции домена, через правый клик мышью по GPO_NTP вызываю меню Edit.

Computer Configuration → Policies → Administrative Tools → System → Windows Time Service → Time Providers → Configure Windows NTP Client, включаю ее Enabled и определяю настройки:

NtpServer: srv-dc.polygon.local,0x9

все остальное оставляю по умолчанию.
После нажимаю Apply & OK.

И не забываем к политике добавить WMI фильтр. В конечном итоге политика должна выглядеть так:

Итоговый вид групповой политики

После когда политика применится к системам согласно WMI-фильтру можно будет проверить куда смотрит рабочая станции если ей нужно точное время:

C:\Users\alektest>w32tm /query /status

Индикатор помех: 0(предупреждений нет)

Страта: 4 (вторичная ссылка - синхронизирована с помощью (S)NTP)

Точность: -6 (15.625ms за такт времени)

Задержка корня: 0.0876923s

Дисперсия корня: 7.8503892s

Идентификатор опорного времени: 0x0A0A0A02 (IP-адрес источника: 10.10.10.2)

Время последней успешной синхронизации: 30.04.2017 16:46:38

Источник: srv-dc.polygon.local

Интервал опроса: 10 (1024s)

C:\Users\alektest>w32tm /monitor

srv-dc.polygon.local *** PDC ***[10.10.10.2:123]:

ICMP: 0ms задержка

NTP: +0.0000000s смещение относительно srv-dc.polygon.local

RefID: ground.corbina.net [85.21.78.91]

Страта: 3

Работает.

На замету: Если же в локальной сети появятся рабочие станции под управлением Windows 8 и выше, то нужно будет модифицировать WMI фильтр.

Но как известно, в случае чего с домен контроллером его роли можно забирать, так может произойти в случае различных проблем. Вот забрали роль PDC и время поехало во всем домене, чтобы этого не произошло нужно создать групповую политику ориентированную только на домен контроллер с ролью PDC: GPO_PDC и WMI фильтр с именем PDC следующего содержания:

Select * from Win32_ComputerSystem where DomainRole = 5

Computer Configuration → Policies → Administrative Tools → System → Windows Time Service → Time Providers → Configure Windows NTP Client, включаю ее Enabled и определяю настройки:

NtpServer: 0.pool.ntp.org,0x9

все
остальное оставляю по умолчанию.
После нажимаю Apply & OK.

и Computer Configuration → Policies → Administrative Tools → System → Windows Time Service → Time Providers -> Enable Windows NTP Client включить Enable.

Также параметр Type вместо NT5DS можно использовать и NTP

И не забываем к политике добавить WMI фильтр ← PDC. Теперь не важно кто является домен контроллером, точное время на нем будет.

А раз так, что рабочие станции не обязательно привязывать/создавать к политике назначения точного времени, ведь по умолчанию рабочие станции домена, итак, забирают точное время с контроллера домена по умолчанию.

Подведу итог:

  • Настраиваю GPO и привязываю ее через WMI фильтр к серверу у которого есть роль PDC
  • В оснастке DHCP указываю параметр кто в домене является сервером у которого клиентским рабочим станциям запрашивать точное время.
  • Если DHCP не на базе Windows, то можно настроить GPO и сделать нацеливание на определенную ось.

На заметку: Если домен контроллер развернут на виртуальной системе, то следует проверить, что время берется не с гипервизора, а через настройку этой заметки.

На заметку: если роль PDC была переназначена на другой сервер, то я советую перезагрузить домен контроллер и все остальные также.

На этом у меня все. Задача выполнена и задокументирована, с уважением автор блога Олло Александр aka ekzorchik.

Уровень сложностиСредний

Время на прочтение8 мин

Количество просмотров11K

Привет, Хабр! Меня зовут Вадим, я Java-разработчик SimbirSoft. В этой статье я расскажу, как на одном из проектов мы реализовали возможность валидации электронной подписи с помощью КриптоПро JCP.

Этот фреймворк оказался хорошей альтернативой КриптоПро SVS после того, как последний попал под санкции Microsoft. Впоследствии на других подобных проектах я убедился в том, что решение рабочее и наиболее подходящее под бизнес-цели заказчиков. Прежде всего это банки, нанимающие организации и другие юрлица, где ведется электронный документооборот. 

Кадр из фильма «Код Да Винчи»

Кадр из фильма «Код Да Винчи»

Наш клиент занимался переоборудованием автомобилей на газовое топливо. Для работы со своими заказчиками ему приходилось вызывать курьеров к каждому, чтобы подписать тот или иной документ. Это было крайне неудобно и затратно. Поэтому он обратился к нам, чтобы реализовать задачу валидации электронной подписи в короткий срок. Вместе с командой из двух разработчиков и одного тимлида нам удалось сделать это за один месяц.

Чтобы решить задачу, мы провели исследование возможных вариантов валидации подписи. Одним из подходящих вариантов стал сервис КриптоПро SVS. Это обертка над КриптоПро CSP, которая предоставляет веб-сервис REST и SOAP для проверки подписи, а также проверяет валидность и квалифицированность сертификата. 

Но при его развертывании в облачной среде Yandex Cloud мы столкнулись с проблемой. В период разработки нашей системы в 2022 году Yandex Cloud перестал поддерживать виртуальные машины Windows в связи с санкциями от компании Microsoft. А сервис SVS подразумевал развертывание в данной операционной системе.

Перенос системы в другой облачный сервис был невозможен, так как вся инфраструктура уже была настроена и успешно работала, переезд занял бы много времени и денег заказчика, а эти ресурсы мы стараемся беречь. Поэтому было принято решение создать свой сервис для валидации detached подписей на основе библиотеки КриптоПро JCP. Она оказалась более низкоуровневой, но доступной для реализации.

О решении

КриптоПро JCP — средство криптографической защиты информации, реализующее российские криптографические стандарты. Разработано в соответствии со спецификацией JCA (Java Cryptography Architecture).

Для разработки своего сервиса валидации подписей важно понимать, какие бывают электронные подписи (ЭП). Начнем с принципа работы, который заключается в шифровании информации. 

1.1 Ассиметричное шифрование

Существует два основных вида шифрования — симметричное и ассиметричное. Мы остановимся на ассиметричном, так как именно оно используется в электронных подписях. Рассмотрим, как работает классический вид ассиметричного шифрования. 

В данном виде шифрования используется два ключа: 

  1. Открытый, который доступен всем, и с помощью которого можно зашифровать информацию.

  2. Закрытый или секретный. Помимо электронных подписей, используется для безопасной передачи информации в интернете. Поэтому рассмотрим данный ключ на примере передачи сообщения.

Допустим, у нас есть два собеседника — Петя и Катя. Они работают на одном проекте, и естественно, на них распространяется NDA, который ни в коем случае нельзя нарушать. Поэтому Петя решает передать Кате код проекта в интернете с помощью ассиметричного шифрования.

Для этого:

  1. Катя генерирует пару ключей: открытый и закрытый.

  2. Катя передает Пете открытый ключ. Передача может осуществляться по незащищенному каналу.  

  3. Петя шифрует код проекта при помощи открытого ключа.

  4. Петя передает Кате зашифрованный код. Передача может осуществляться по незащищенному каналу.

  5. Катя расшифровывает полученную информацию с помощью закрытого ключа. 

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

1.2 Ассиметричное шифрование в электронной подписи

Несмотря на то, что электронные подписи работают по алгоритму ассиметричного шифрования, всё происходит немного иначе. В примере, который мы рассмотрели выше, наше сообщение мог зашифровать любой пользовать, но расшифровать его мог только обладатель закрытого ключа. В случае с электронными подписями все по-другому. Зашифровать документ должен только один человек (обладатель подписи), поэтому мы будем шифровать на закрытом ключе, а вот проверить валидность подписи уже может любой. На сайте удостоверяющего центра, как правило, можно скачать открытый ключ проверки, хеш которого должен совпадать с хешем открытого ключа владельца. Таким образом доказывается его достоверность.

Тут-то мы и подходим к валидации подписей. Как же это работает, и почему любой человек может проверить ее законность и корректность?

1.3 Валидация подписи

Подписи бывают двух видов — отсоединенная, или detached, и присоединенная, или attached

Главное отличие этих подписей заключается в том, что при создании присоединенной подписи формируется один файл, который содержит и саму подпись, и документ. А при создании отсоединенной подписи формируется отдельный файл с расширением .sign, который как раз и содержит detached-подпись. 

Для валидации обоих типов подписи используется одна логика. Сертификат электронной подписи пользователя связан с сертификатом удостоверяющего центра, который выдал ему эту подпись, а сертификат удостоверяющего центра связан с корневым сертификатом. Все сертификаты удостоверяющих центров и корневых сертификатов находятся в открытом доступе на портале УФО.

По сути, для валидации подписи мы проходим по цепочке сертификатов, и если все они являются доверенными, то подпись является валидной.

1.4 Реализация валидации на Kotlin c использованием JCP

1.4.1 Импорт корневых сертификатов

Начнем с того, что для валидации ЭП нам необходимы корневые и промежуточные сертификаты, а также список отозванных сертификатов. Список корневых сертификатов, необходимо скачать с портала УФО и установить в Java-машину. 

Для Java есть стандартное хранилище доверенных CA-сертификатов (cacerts), которое используется для Java-приложений и является составной частью среды выполнения приложения — JRE (Java Runtime Environment). Оно располагается в директории jre/lib/security/cacerts, именно туда и нужно установить все корневые сертификаты с помощью следующей команды.

keytool -importcert -cacerts -storepass
"changeit" -file путь_до_сертификата.cer -alias
"название_сертификата_в_хранилище"

Alias для сертификата можно придумывать любой!

1.4.2 Валидация detached подписи на Kotlin

Так как detaсhed-подпись является отдельным файлом с расширением .sign, для валидации нам понадобится еще и исходный файл, который подписывался.

Мы поступили следующим образом:

  • файл с .sign мы переводили в base64 и передавали в сервис валидации как String

  • исходный документ передавали как байтовый поток с типом ByteArray

fun validateDetachedCadesSign(signature: String, source: ByteArray){
    Security.addProvider(JCP())
    Security.addProvider(RevCheck())

    System.setProperty("com.sun.security.enableCRLDP", "true")
    System.setProperty("com.ibm.security.enableCRLDP", "true")
    System.setProperty("ru.CryptoPro.reprov.enableAIAcaIssuers", "true")
    System.setProperty("com.sun.security.enableAIAcaIssuers", "true");

    val signStream: InputStream = ByteArrayInputStream(Base64.decode(signature.toByteArray()))
    val fileStream: InputStream = ByteArrayInputStream(source)

    val cadesSignature = CAdESSignature(signStream, fileStream, null)

    cadesSignature.verify(null)
}

Проперти, которые мы устанавливаем, указывают на то, что отозванные сертификаты будут искаться в интернете (этот участок кода взят из документации JCP).  

1.4.3. Получение информации об электронной подписи

Помимо того, что мы можем просто проверить электронную подпись с помощью JCP, мы можем получить массу информации о ней. Например, ФИО ее владельца, ИНН, ОГРН (если это юрлицо), номер сертификата и многое другое. Все это хранится в объекте cadesSignature, который мы создали для валидации. Мы использовали эти данные для создания штампов в подписанных документах.

val signer = cadesSignature.cAdESSignerInfos
val cert = X509CertImpl(signer[0].signerCertificate.encoded)

С помощью данного кода мы можем получить сертификат, а из него уже извлечь нужные нам данные:

  • cert.serialNumber – номер сертификата 

  • cert.notBefore – дата выпуска сертификата

  • cert.notAfter – дата истечения сертификата

Остальные данные нам удалось получить слегка изощренным способом из-за того, что в классе X509CertImpl ИНН, ОГРН и ФИО не выделены в отдельные переменные. Все эти данные хранятся в поле subjectX500PrincipalInternal нашего объекта cert, поэтому мы преобразовали его в строку и применили к ней ряд регулярных выражений.

  1. ИНН и ОГРН

val innPatter = Pattern.compile("(?<=КПП=)[^,]*", Pattern.MULTILINE)
val ogrnPattern = Pattern.compile("(?<=ОГРН=)[^,]*", Pattern.MULTILINE)
  1. Фамилия

val surnamePattern = Pattern.compile("(?<=SN=)[^,]*", Pattern.MULTILINE)
  1. Имя, отчество

val giveNamePattern = Pattern.compile("(?<=G=)[^,]*", Pattern.MULTILINE)

Далее мы просто применили эти регулярные выражения к нашему subject и получили все необходимые данные для штампа электронной подписи.

fun getCertInfo(cadesSignature: CAdESSignature): CertInformationResponse{
    val signer = cadesSignature.cAdESSignerInfos
    val cert = X509CertImpl(signer[0].signerCertificate.encoded)
    val serialNumber = cert.serialNumber
    val subject = cert.subjectX500PrincipalInternal.toString()

    log.info("Certificate subject = \n$subject")

    val surnamePattern = Pattern.compile("(?<=SN=)[^,]*", Pattern.MULTILINE)
    val giveNamePattern = Pattern.compile("(?<=G=)[^,]*", Pattern.MULTILINE)
    val innPatter = Pattern.compile("(?<=КПП=)[^,]*", Pattern.MULTILINE)
    val ogrnPattern = Pattern.compile("(?<=ОГРН=)[^,]*", Pattern.MULTILINE)

    val matcherSurname = surnamePattern.matcher(subject)
    val matcherGiveName = giveNamePattern.matcher(subject)
    val matherInn = innPatter.matcher(subject)
    val matherOgrn = ogrnPattern.matcher(subject)

    var surname = ""
    while (matcherSurname.find())
        surname = subject.substring(matcherSurname.start(), matcherSurname.end())

    var firstName = ""
    var patronymic: String? = null
    while (matcherGiveName.find()){
        val giveName = subject.substring(matcherGiveName.start(), matcherGiveName.end())
        val splitGiveName = giveName.split(" ")
        firstName = splitGiveName[0]
        if(splitGiveName.size > 1)
            patronymic = splitGiveName[1]
    }

    var inn = ""
    while (matherInn.find())
        inn = subject.substring(matherInn.start(), matherInn.end())

    var ogrn: String? = null
    while (matherOgrn.find())
        ogrn = subject.substring(matherOgrn.start(), matherOgrn.end())


    return CertInformationResponse(
        serialNumber = serialNumber,
        ownerSurname = surname,
        ownerFirstName = firstName,
        ownerPatronymic = patronymic,
        releaseDate = cert.notBefore,
        expirationDate = cert.notAfter,
        inn = inn,
        ogrn = ogrn
    )
}

1.4.4 Проблема получения информации из тестового сертификата

В ходе тестирования нашего решения мы использовали как реальные электронные подписи, так и тестовые сертификаты, которые можно легко выпустить на сайте Тестового удостоверяющего центра ООО «КРИПТО-ПРО». На реальных подписях все отрабатывало отлично, и мы получали всю необходимую информацию, но с тестовыми возникла проблема.

Дело в том, что при выпуске тестового сертификата электронной подписи в поле subjectX500PrincipalInternal хранится не так много информации, иногда оно может содержать всего одно значение. Вот реальный пример:

Поэтому для удобства тестирования мы создали интерфейс CertInfoProvider с методом получение информации, описанным выше. И создали две его имплементации CertInfoProviderProd, CertInfoProviderDev.

@Service
@ConditionalOnProperty(prefix = "test-cert", name = ["enable"], havingValue = "0")
class CertInfoProviderProd: CertInfoProvider {
    override fun getCertInfo(cadesSignature: CAdESSignature): CertInformationResponse {
        return super.getCertInfo(cadesSignature)
    }
}
@Service
@ConditionalOnProperty(prefix = "test-cert", name = ["enable"], havingValue = "1")
class CertInfoProviderDev: CertInfoProvider {
    override fun getCertInfo(cadesSignature: CAdESSignature): CertInformationResponse {
        val signer = cadesSignature.cAdESSignerInfos
        val cert = signer[0].signerCertificate
        val serialNumber = cert.serialNumber
        val testCert = "Test Center"

        return if(cert.issuerX500Principal.toString().contains(testCert)) {
            CertInformationResponse(
                serialNumber = serialNumber,
                ownerSurname = testCert,
                ownerFirstName = testCert,
                ownerPatronymic = testCert,
                releaseDate = cert.notBefore,
                expirationDate = cert.notAfter,
                inn = testCert,
                ogrn = testCert
            )
        } else{
            super.getCertInfo(cadesSignature)
        }
    }
}

Таким образом, просто переключая параметр в конфиг мапе нашего сервиса мы могли очень гибко и быстро в случае необходимости включить, либо выключить валидацию тестовых сертификатов.

Результат 

В ходе работы нам удалось прежде всего сберечь денежный и временной ресурс заказчика.

  1. Переезд проекта в новый облачный сервис мог занять очень длительный срок, так как в команде не было DevOps-инженера, который бы смог заново настроить всю выстроенную инфраструктуру.

  2. До реализации сервиса валидации электронных подписей заказчик тратил время и финансы на вызов курьеров к каждому клиенту, чтобы подписать документы. Теперь в этом нет необходимости.

Спасибо за внимание!

Больше авторских материалов для backend-разработчиков от моих коллег читайте в соцсетях SimbirSoft – ВКонтакте и Telegram.

Страницы 1

Чтобы отправить ответ, нужно авторизоваться или зарегистрироваться

#1 2017-10-27 13:01:30

  • grey_goblin
  • Посетитель
  • Неактивен

Установка модуля поддержки КриптоПро JCP в указанную jde

Добрый день.

Мы поставляем свой продукт клиентам вместе предварительно настроенной необходимым образом jde. То есть jde не устанавливается явно в систему.
Сейчас потребовалась интеграция с КриптоПро JCP + RuToken.
Приложение работает под Windows.
КриптоПро JCP позволяет выбрать jde в которую производится установка, а вот установить модуль поддержки RuToken в эту же jde не удается. Если в системе нет установленной через установщик среды java с установленной в нее КриптоПро JCP, то модуль поддержки RuToken выдает ошибку установки, не предлагая выбора каталога jre как это делает установщик КриптоПро JCP.
Пробовал закидывать вручную rtjlib.jar и rtjcard.jar в jre\lib\ext, а rtjcardx64.dll в jre\bin, но при запуске контрольной панели jcp ControlPane.bat с указанием пути к среде панель RuToken не появлялась.
Подскажите пожалуйста, как можно выйти из такой ситуации?

#2 Ответ от Владимир Салыкин 2017-10-27 14:20:58

  • Владимир Салыкин
  • Посетитель
  • Неактивен

Re: Установка модуля поддержки КриптоПро JCP в указанную jde

Добрый день, grey_goblin.

Ваш вопрос поняли. Честно говоря, никогда не пытались сделать что-то подобное. Дайте нам пару дней на покопать и мы постараемся помочь с решением этой проблемы.

#3 Ответ от grey_goblin 2017-10-27 15:12:09

  • grey_goblin
  • Посетитель
  • Неактивен

Re: Установка модуля поддержки КриптоПро JCP в указанную jde

Владимир, спасибо за ответ. Буду ждать результата.

#4 Ответ от grey_goblin 2017-11-07 09:27:36

  • grey_goblin
  • Посетитель
  • Неактивен

Re: Установка модуля поддержки КриптоПро JCP в указанную jde

Добрый день.

Есть ли новости по моему вопросу?

#5 Ответ от Владимир Салыкин 2017-11-08 11:44:44 (2018-10-16 14:35:29 отредактировано Владимир Салыкин)

  • Владимир Салыкин
  • Посетитель
  • Неактивен

Re: Установка модуля поддержки КриптоПро JCP в указанную jde

Добрый день, grey_goblin.

Для корректной инсталляции необходимо следующее:
1. Для версии Java 8 CryptoPro JCP 2.0
2. Распаковать модули поддержки в какую-нибудь папку командой rtSup_CryptoProJCP.v.2.06.00.0013 /V /a
(лучше не на диск C:, так как иначе файлы будет найти сложнее)
3. Из папки, куда распаковали модули поддержки, произвести установку через командную строку, выполнив:
[Путь к каталогу JRE]\bin\java -jar rtjlib.jar -install -rutoken

После этого должно заработать.

#6 Ответ от grey_goblin 2017-11-08 18:10:31

  • grey_goblin
  • Посетитель
  • Неактивен

Re: Установка модуля поддержки КриптоПро JCP в указанную jde

Добрый вечер.

Протестировал на чистой машине. Все получилось. Большое спасибо.

Страницы 1

Чтобы отправить ответ, нужно авторизоваться или зарегистрироваться

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Windows 7 installer free
  • Очень долго открывается проводник windows 10
  • Как создать загрузочный usb носитель для установки windows 10
  • Windows 7 game edition lite
  • Накопительный пакет обновления для windows server 2012