Формирование PKCS#7 detached signature для авторизации через систему ЕСИА

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Всем привет! Меня зовут Богдан, я тимлид 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.

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

Источник: https://habr.com/ru/articles/783378/


Интересные статьи

Интересные статьи

Привет, Хабр! 5 октября в 19:00 МСК мы начнём вторую встречу из цикла "В ИТ через текст" с новыми темами от новых докладчиков. Мероприятие будет проводиться в Нижнем Новгороде в центре инноваций "РОСТ...
Каждый Flutter разработчик рано или поздно сталкивался с DartPad. Но у него гораздо больше возможностей, чем просто запускать код. В этот раз поделимся как просто шарить код через DartPad.Меня зовут А...
Привет, Хабр! Меня зовут Елена, я ведущий аналитик ИТ-компании SimbirSoft. Сегодня хочу затронуть такую тему, как нефункциональные требования к ИТ-продукту, которым не всегда уделяется должное внимани...
Продолжаю публикацию решений отправленных на дорешивание машин с площадки HackTheBox. В данной статье брутфорсим пароль от SMB и повышаем привилегии до администратора от имени ч...
Около полугода назад задумал сделать программу для управления компьютером через браузер. Начал с простого односокетного HTTP сервера, который передавал картинки в браузер и получал координаты кур...