Всем привет! Меня зовут Богдан, я тимлид java-команды в одном из российских банков. И да, конечно, вот мой телеграм где я делюсь буднями нашей разработки и всякими эдакими приемами которые мы используем.
Недавно появилась необходимость интеграции с авторизацией через систему ЕСИА о сути такой интеграции можно почитать например тут. Статья же про то как правильно средствами исключительно java, без всяких крипто про и прочих платных СКЗИ сформировать подпись запроса в формате PKCS#7 detached signature с использованием ГОСТ сертификата и ГОСТ Р 34.10-2012 алгоритма подписи.
Не люблю читать водянистые лонг риды, а еще более не люблю их писать, по этому прошу любить и жаловать, код для использования в ваших проектах: https://github.com/BlackSan11/esia-crypto, ведь что может здесь быть более красноречиво чем мысль оформленная в код и библиотеку в maven-централе? :)
Для подключения библиотеки:
Gradle:
implementation group: 'ru.chervoniy-ba', name: 'esia-crypto', version: '1.0.1'
Maven:
<dependency>
<groupId>ru.chervoniy-ba</groupId>
<artifactId>esia-crypto</artifactId>
<version>1.0.1</version>
</dependency>
More:
https://central.sonatype.com/artifact/ru.chervoniy-ba/esia-crypto
Для формирование подписи необходимо настроить и создать объект EsiaSigner:
EsiaSigner esiaSigner = EsiaSigner.builder()
.keyStoreSupplier(keyStoreSupplier)
.privateKeyPasswordSupplier(() -> "key_password")
.signingCertificateAliasSupplier(() -> "cert_alias")
.build();
Где указать supplier'ы ключницы и алиаса нового сертификата и софрмировать подпись вызовом:
byte[] signatureByteArray = esiaSigner.signPkcs7("DATA FOR SIGNING".getBytes(StandardCharsets.UTF_8));
Ключница:
Создать supplier ключницы можно например так:
Supplier<KeyStore> keystoreSupplier = () -> {
* try (InputStream stream = new FileInputStream("path/to/keystore.p12")) {
* KeyStore store = KeyStore.getInstance("PKCS12");
* store.load(stream, "p@ssword".toCharArray());
* return store;
* } catch (Exception e) {
* log.error("Keystore loading error", e);
* throw new RuntimeException(e);
* }
* };
Также стоит сказать про настройки по умолчанию которые можно переопределить при создании EsiaSigner:
Алгоритм по умолчанию: GOST3411-2012-256WITHECGOST3410-2012-256
Признак открепленной подписи: true.
Спасибо за внимание, надеюсь был полезен, предложения по улучшению, а также ваши тапки жду в телеграмм канале.
Комментарии (6)
Qwertovsky
27.12.2023 02:49Алгоритм по умолчанию: GOST3411-2012-256WITHECGOST3410-2012-256
Алгоритм есть в сертификате. Можно не делать настройку для этого. Возможен ли другой?
certificateForSign.getSignatureAlgorithm();
blacksan Автор
27.12.2023 02:49Другой алгоритм? Можно, вот так:
EsiaSigner esiaSigner = EsiaSigner.builder()
...
.signingAlgorithmSupplier(() -> "SOME ALGO")
...
.build();
aleksandy
А какая у кода лицензия? По-хорошему надо бы добавить в репозиторий лицензию и перерелизить артефакт уже с ней.
blacksan Автор
Артефакт залил с лицензией "The Apache License, Version 2.0", в реп добавлю, спасибо!