Данная статья рассматривает процесс установки КриптоПро JCP на компьютер под управлением ОС Windows.
Авторизуйтесь под учётной записью с правами администратора и распакуйте ранее загруженный архив jcp-2.0.40502.zip в любую директорию. Найдите в этой директории и запустите файл setup.exe
В открывшемся окне мастера установки КриптоПро JCP выберите язык и нажмите «Далее»:
В окне выбора действия укажите «Установить» и нажмите кнопку «Далее»:
Прочитайте лицензионное соглашение и примите его условия, нажмите кнопку «Далее»:
В окне выбора установленной JRE требуется указать директорию размещения JRE, которую вы планируете использовать при работе КриптоПро JCP. Если ранее вы выполнили установку JRE по умолчанию, как было рекомендовано в посвящённой установке Java статье, то просто оставьте это значение без изменений, как изображено ниже, в противном случае выберете директорию, куда ранее была установлена JRE и нажмите «Далее»:
В окне выбора установки компонентов КриптоПро JCP включите флажок «Включить усиленный контроль использования…» в дополнение к уже включенным по умолчанию флажкам и нажмите кнопку «Далее»:
Если у вас есть приобретенная лицензия КриптоПро JCP, введите ее серийный номер в окне ввода серийного номера продукта, или оставьте это поле пустым, если планируете приобретение лицензии позже. Нажмите кнопку «Далее»:
Еще раз проверьте корректности устанавливаемой конфигурации и нажмите кнопку «Установка»:
По окончании установки инсталлятор сообщит вам о завершении процесса, нажмите кнопку «Далее»:
В завершающем окне инсталлятора нажмите кнопку «Закрыть»:
После закрытия окна инсталлятора откроется окно инициализации усиленного режима контроля использования ключевой информации. Выполняйте произвольные движения мышью и нажатия клавиш в соответствии с подсказками:
По завершении процесса инициализации вам откроется окно контрольной панели КриптоПро JCP:
Контрольная панель служит для настройки КриптоПро JCP, оставьте ее открытой, она понадобится нам через один шаг.
Установите правильный порядок чередования криптопровайдеров
Откройте файл java.security, расположенный в директории C:\Program Files\Java\jre1.8.0_201\lib\security:
Сразу после установки КриптоПро JCP вы увидите такой порядок чередования криптопровайдеров в данном файле:
security.provider.11=ru.CryptoPro.reprov.RevCheck
security.provider.12=ru.CryptoPro.JCP.JCP
security.provider.13=ru.CryptoPro.Crypto.CryptoProvider
Измените порядок чередования в любом текстовом редакторе, запущенном под учётной записью с административными правами, на изображённый ниже:
Перенесите ключи электронной подписи в целевую директорию
Архив ключей обычно имеет название, состоящее из произвольных букв/цифр и включает в себя директорию с комплектом файлов с расширением .key:
Распакуйте архив с ключами в стандартную директорию ключей КриптоПро JCP C:\Users\%UserName%\AppData\Local\Crypto Pro. Обратите особое внимание, что в архиве содержится директория с ключами. В стандартной директории ключей КриптоПро JCP должна появиться директория, в которой будут размещены ключи. Не следует изменять имя этой директории, оставьте то имя, которое было в архиве.
Пример размещения файлов ключей:
Подключите ключи электронной подписи информационной системы Участника
Вернитесь в панель управления КриптоПро JCP и перейдите на вкладку «Хранилища ключей и сертификатов». Откройте хранилище контейнеров «HDImageStore». Если вы делали всё согласно процедуре, описанной в данной статье, то увидите свой контейнер с ключами. После двойного клика на контейнере и ввода пароля подписи вам откроется ключ обмена и сертификат:
Возможно, что ваши ключи не защищены паролем, в таком случае в окне ввода пароля выберите пункт «Не задавать пароль»:
Так же необходимо проверить, что открытый ключ добавлен в контейнер. Если нет, то нажмите «Добавить» и выберете файл открытого ключа с расширением .cer.
После подключения ключей настоятельно рекомендуется изменить пароль контейнера. Для этого выделите контейнер и нажмите кнопку «Изменить пароль». Откроется окно «Ввод нового пароля». Введите новый пароль, состоящий минимум из восьми знаков, и нажмите кнопку «ОК»:
Теперь криптопровайдер установлен и готов к работе, можно переходить к установке и настройке СУБД.
dmitryp |
|
Статус: Участник Группы: Участники Сказал(а) «Спасибо»: 3 раз |
Начиная с JCP 2.0.40109-A, все настройки JCP становятся локальными для пользователя: Цитата: все настройки хранятся в разделе Java Preferences пользователя user, а не system Это усложняет использование JCP в Windows-службах — т.к. контрольную панель JCP (далее КП) нужно запускать из-под той учётной записи (УЗ), под которой будет работать служба. Пока что вижу следующие пути: Скажите, пожалуйста — планируете ли вы как-то поддерживать работу с виртуальными УЗ? Рассматриваете ли возвращение глобальных настроек в каком-то виде? Отредактировано пользователем 2 июля 2019 г. 7:08:22(UTC) |
|
|
two_oceans |
|
Статус: Эксперт Группы: Участники Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз |
Насколько помню есть возможность запустить программы (но наверно не службы) от имени самой системы в интерактивном режиме (с видимым интерфейсом). КП не пробовал, а вот regedit помню запускал в Семерке и смотрел разделы реестра вроде SAM, которые не видны администраторам. Точную процедуру не помню, вроде тоже через psexec. Поэтому чисто теоретически возможно обойтись без всяких других учетных записей. |
|
|
dmitryp |
|
Статус: Участник Группы: Участники Сказал(а) «Спасибо»: 3 раз |
two_oceans, «от имени самой системы» — это, видимо, от LocalSystem? Это то же самое что второй вариант, но лучше бы LocalSystem для служб не использовать. Запускать приложения от LocalService точно возможно (запускал КП через psexec) — для LocalSystem должно быть то же самое. Но настройки в любом случае будут локальными для конкретной УЗ (т.е. для LocalSystem/LocalService). |
|
|
Elvira Borodina |
|
Статус: Сотрудник Группы: Участники Сказал(а) «Спасибо»: 2 раз |
Добрый день! Мы обсудили Вашу проблему. Пока мы не планировали возвращение глобальных настроек. Но если данная проблема будет актуальной (и трудно решаемой) в дальнейшем, мы предоставим её решение в будущих релизах. |
|
|
Пользователи, просматривающие эту тему |
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 Ассиметричное шифрование
Существует два основных вида шифрования — симметричное и ассиметричное. Мы остановимся на ассиметричном, так как именно оно используется в электронных подписях. Рассмотрим, как работает классический вид ассиметричного шифрования.
В данном виде шифрования используется два ключа:
-
Открытый, который доступен всем, и с помощью которого можно зашифровать информацию.
-
Закрытый или секретный. Помимо электронных подписей, используется для безопасной передачи информации в интернете. Поэтому рассмотрим данный ключ на примере передачи сообщения.
Допустим, у нас есть два собеседника — Петя и Катя. Они работают на одном проекте, и естественно, на них распространяется NDA, который ни в коем случае нельзя нарушать. Поэтому Петя решает передать Кате код проекта в интернете с помощью ассиметричного шифрования.
Для этого:
-
Катя генерирует пару ключей: открытый и закрытый.
-
Катя передает Пете открытый ключ. Передача может осуществляться по незащищенному каналу.
-
Петя шифрует код проекта при помощи открытого ключа.
-
Петя передает Кате зашифрованный код. Передача может осуществляться по незащищенному каналу.
-
Катя расшифровывает полученную информацию с помощью закрытого ключа.
Важно отметить, что при такой схеме передачи нам не нужны защищенные каналы связи, так как перехват любых данных не имеет смысла, поскольку восстановить исходную информацию возможно только при помощи закрытого ключа, который есть только у Кати.
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, поэтому мы преобразовали его в строку и применили к ней ряд регулярных выражений.
-
ИНН и ОГРН
val innPatter = Pattern.compile("(?<=КПП=)[^,]*", Pattern.MULTILINE)
val ogrnPattern = Pattern.compile("(?<=ОГРН=)[^,]*", Pattern.MULTILINE)
-
Фамилия
val surnamePattern = Pattern.compile("(?<=SN=)[^,]*", Pattern.MULTILINE)
-
Имя, отчество
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)
}
}
}
Таким образом, просто переключая параметр в конфиг мапе нашего сервиса мы могли очень гибко и быстро в случае необходимости включить, либо выключить валидацию тестовых сертификатов.
Результат
В ходе работы нам удалось прежде всего сберечь денежный и временной ресурс заказчика.
-
Переезд проекта в новый облачный сервис мог занять очень длительный срок, так как в команде не было DevOps-инженера, который бы смог заново настроить всю выстроенную инфраструктуру.
-
До реализации сервиса валидации электронных подписей заказчик тратил время и финансы на вызов курьеров к каждому клиенту, чтобы подписать документы. Теперь в этом нет необходимости.
Спасибо за внимание!
Больше авторских материалов для 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
Чтобы отправить ответ, нужно авторизоваться или зарегистрироваться