Данная инструкция рассказывает о том, как создать HTTP-заголовки, содержащие дайджест и подпись запроса в сервис RaifPay. Подписываемыми данными выступает JSON-объект запроса, в котором отсутствует какое-либо форматирование, а все поля отсортированы в алфавитном порядке.
Для работы требуется JDK 11+ и установленная environment переменная JAVA_HOME.
Для проверки требуется выполнить в терминале следующие команды:
java -versionecho $JAVA_HOME
Уже существующие в RBO сертификаты подойдут если только они были созданы с этого же компьютера. Если компьютер неизвестен или недоступен, то необходимо запросить новый сертификат и все последующие действия выполнять только на нем.
- Необходимо выпустить сертификат в настройках личного кабинета RBO и затем скачать его на компьютер с установленным КриптоПро CSP.
- Импортировать скачанный сертификат в КриптоПро CSP.
- Получить публичный сертификат
AO Raiffeisenbank RootCA(например, экспортировать из браузера с открытой страницей Райффайзен Банка). - Проверить, что файл имеет расширение
pem,derилиcerи переменовать его вraif-ca-root.cer. - Сделать импорт этого сертификата в JDK, который будет запускать сервис, накладывающий подпись:
keytool -importcert -trustcacerts -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit -noprompt -alias raif-root-ca -file raif-ca-root.cer
- Необходимо получить лицензию и скачать КриптоПро CSP 5.0
- Скачать библиотеки сертифицированной версии КриптоПро Java CSP и JTLS (5.0.45549-A для Java 11 и выше):
- Скачать библиотеки криптографии
BouncyCastleверсии 1.60 для jdk15: - Скачать библитеку Apache Codec последней версии:
- Добавить скачанные jar-файлы в classpath сервиса, который будет накладывать подпись.
Набор библиотек КриптоПро Java CSP и JTLS предоставляет доступ к криптографическим функциям,
расположеннным в приложении КриптоПро CSP 5.0,
поэтому для наложения подписи требуются одновременно эти два комплекта ПО.
Необходимо экспортировать приватный ключ вместе с цепочкой сертификатов в формате PFX из КриптоПро CSP (доступно при включении расширенного режима).
При экспорте необходимо задать пароль, защищающий файл.
Будет создан файл-контейнер приватного ключа с расширением pfx: key.pfx (имя может отличаться).
Необходимо создать объект хранилища приватного ключа KeyStore:
String password = "пароль заданный при экспорте";
InputStream privateKeyInputStream = new FileInputStream("key.pfx");
KeyStore keyStore = KeyStore.getInstance(JCSP.PFX_STORE_NAME, JCSP.PROVIDER_NAME);
keyStore.load(privateKeyInputStream, password.toCharArray());После этого необходимо узнать поле CN сертификата приватного ключа, который лежит в key.pfx. Это можно сделать,
проверив доступный список имен в KeyStore и выбрать нужное (чаще всего оно совпадает с именем учетной записи RBO):
keyStore.aliases() // вернет Enumeration всех доступных имен, выберем оттуда нужноеString keyAlias = "Поле CN сертификата приватного ключа";Далее, извлекаем приватный ключ и цепочку сертификатов (реализация метода getCertificateChain находится здесь):
PrivateKey privateKey = (PrivateKey) keyStore.getKey(keyAlias, password.toCharArray());
List<X509Certificate> certificateChain = getCertificateChain(keyStore, keyAlias);Считаем дайджест входных данных, на который будет наложена подпись:
byte[] digest = DigestUtils.sha256(inputData);Далее, вычисляем подпись (реализация метода sign находится здесь)
String signature = sign(privateKey, certificateChain, digest);Формируем http-заголовки, которые необходимо добавлять к запросу на создание платежа:
String digestHeader = "Content-Digest: " + Base64.getEncoder().encodeToString(digest);
String signatureHeader = "Signature: " + signature);Данный проект включает в себя два простых приложения, демонстрирующих наложение подписи. Перед сборкой необходимо убедиться, что на компьютере установлен JDK 11+, все требуемые библиотеки скачаны и находятся в папке lib.
-
FullSignatureGenerationExample.java - приложение, в котором генерируется подпись с полной цепочкой сертификатов
-
ShortSignatureGenerationExample.java - приложение, в котором генерируется, короткая подпись без включения всей цепочки
После этого необходимо собрать проект из командной строки командой:
./gradlew build
Если какая-то из требуемых библиотек отсутствует, сборщик Gradle сообщит об этом. После успешной сборки будет доступен дистрибутив приложения в директории:
build/distributions/data-signing-1.0.0.zip
Выполнив в командной строке команду:
unzip build/distributions/data-signing-1.0.0.zip
Мы распакуем архив в корневую директорию проекта в папку data-signing-1.0.0. После этого можно запустить приложение:
./data-signing-1.0.0/bin/data-signing <key-file-path> <key-alias> <key-password> <data>
Где:
- key-file-path - путь к файлу с приватным ключом
- key-alias - поле CN в сертификате приватного ключа
- key-password - пароль указанный при экспорте приватного ключа
- data - подписываемые данные