1. Скачайте и установите КриптоПро CSP (для работы требуется приобретение лицензии)
2. Скачайте плагин со страницы
3. Для установки плагина на Windows воспользуйтесь инструкцией
Для установки плагина на MacOs воспользуйтесь инструкцией
4. Проверьте корректность установки плагина на странице
5. Добавьте адрес https://www.rbo.raiffeisen.ru в список "Доверенных сайтов" плагина
1. Перейдите в раздел «Настройки» - «Сертификаты для подписи» - нажмите кнопку «Создать сертификат»
2. В окне запроса укажите в соответствующих полях Наименование организации, Средство подписи, Email, Город. Ряд полей может быть заполнен системой автоматически. В поле «Организация» и «Средство подписи» выбор значений осуществляется из выпадающего списка. После заполнения всех данных нажмите кнопку «Запросить»
3. Далее система предложит выбрать устройство для хранения ключей.
Для Windows возможны следующие варианты хранения ключений:
- Для хранения ключей АСП на USB-токене выберите из списка ARDS Jacarta, Aladdin Token JC либо AKS ifdh.
- Для хранения ключей АСП на съемном носителе выберите Дисковод (E, H, F и т.д.)
- Для хранения ключей АСП в реестре компьютера выберите Реестр.
После выбора носителя нажмите кнопку «ОК»
Для MacOS:
Генерация ключей в MacOS возможна только на внутренний накопитель системы!
Если Вам необходимо сгенерировать ключи на внешний переносной накопитель (USBflash, USB-token), произведите генерацию на ПК с Windows. В дальнейшем можно использовать данный ключ на MacOS.
4. После выбора необходимого устройства откроется окно генератора случайной последовательности. Для его прохождения перемещайте указателем мыши в пределах данного окна или нажимайте различные клавиши, пока шкала не заполнится полностью.
5. Финальным этапом является ввод пароля к устройству для хранения ключей.
Если в качестве такого устройства используется USB-токен, то необходимо указать pin-код устройства и нажать кнопку «ОК».
Если в качестве хранения ключей используется съемный носитель или реестр, то в полях «Новый пароль» и «Подтверждение» задайте пароль, который в дальнейшем будет использован для подписи документов. Нажмите кнопку «ОК». Требования к паролю отсутствуют – можно указать любой пароль.
6. Созданный запрос будет направлен в банк на обработку, Вам необходимо подписать его с помощью SMS-OTP(инструкция по подключению SMS-OTP доступна по ссылке - https://cdn.rbo.raiffeisen.ru/offerpics/ru_sms-otp_pro.pdf), либо распечатать его в 2-х (двух) экземплярах, поставить подписи в полях «Владелец ключа АСП» (пользователь, на которого выпущен сертификат) и «Руководитель компании» (если пользователь является и владельцем сертификата, и руководителем – подпись ставится в оба поля), заверить обе копии печатью Вашей организации, после чего передать экземпляры в обслуживающее отделение банка.
1. Перейдите в раздел «Настройки» - «Сертификаты для подписи» - нажмите кнопку «Скачать»
2. Откройте "КриптоПро CSP" - "Сервис" и нажмите на кнопку "Установить личный сертификат". Будет открыт "Мастер установки личного сертификата"
3. Выберите скаченный на шаге 1 сертификат и нажмите на кнопку "Далее"
4. Откроется форма с деталями сертификата. Нажите на кнопку "Далее"
5. Укажите крипто-контейнер, который был создан на этапе выпуска сертификата и нажмите на кнопку "Далее"
6. В открывшемся окне установите флаг "Установить сертификат (цепочку сертификатов) в контейнер" и нажмите на кнопку "Далее"
7. В открывшемся окне нажмите кнопку "Готово"
8. Введите пароль от созданного ранее крипто-контейнер и нажмите на кнопку "Ок".
Установка сертификата завершена.
1. Выполните шаг 1, аналогичный установки сертификата на Windows
2. Откройте раздел "Сертификаты" в КриптоПро CSP и нажмите на кнопку "Установить сертификат". Выберите выгруженный на предидущем шаге сертификат.
3. Сертификат будет установлен в ранее созданный крипто-контейнер
Для работы требуется JDK 11+ и установленная environment переменная JAVA_HOME
.
Для проверки требуется выполнить в терминале следующие команды:
java -version
echo $JAVA_HOME
AO Raiffeisenbank RootCA
(например, экспортировать из браузера с открытой страницей Райффайзен Банка).cer
и переменовать его в raif-ca-root.cer
.keytool -importcert -trustcacerts -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit -noprompt -alias raif-root-ca -file raif-ca-root.cer
BouncyCastle
версии 1.60 для jdk15:
Необходимо экспортировать приватный ключ вместе с цепочкой сертификатов в формате 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 сертификата приватного ключа";
Далее, извлекаем приватный ключ и цепочку сертификатов:
PrivateKey privateKey = (PrivateKey) keyStore.getKey(keyAlias, password.toCharArray());
List<X509Certificate> certificateChain = getCertificateChain(keyStore, keyAlias);
Считаем дайджест входных данных, на который будет наложена подпись:
byte[] digest = DigestUtils.sha256(inputData);
Далее, вычисляем подпись
String signature = sign(privateKey, certificateChain, digest);
Формируем http-заголовки, которые необходимо добавлять к запросу на создание платежа:
String digestHeader = "Content-Digest: " + Base64.getEncoder().encodeToString(digest);
String signatureHeader = "Signature: " + signature);
Используемые функции:
String sign(PrivateKey privateKey, List<X509Certificate> certificateChain, byte[] digest) {
// true: detached-подпись (не включает в себя подписанные данные)
var cadesSignature = new CAdESSignature(true);
cadesSignature.setCertificateStore(createCollectionStore(certificateChain));
// Отключение проверки статуса сертификата (для работы в offline-режиме)
// cadesSignature.setOptions(new Options().disableCertificateValidation());
cadesSignature.addSigner(
JCSP.PROVIDER_NAME,
JCP.GOST_DIGEST_2012_256_OID,
JCP.GOST_PARAMS_SIG_2012_256_KEY_OID,
privateKey,
certificateChain,
CAdESType.CAdES_BES,
null,
false
);
var signatureStream = new ByteArrayOutputStream();
cadesSignature.open(signatureStream);
cadesSignature.update(digest);
cadesSignature.close();
signatureStream.close();
byte[] result = signatureStream.toByteArray();
return Base64.getEncoder().encodeToString(result);
}
List<X509Certificate> getCertificateChain(KeyStore keyStore, String alias) {
return Arrays.stream(keyStore.getCertificateChain(alias))
.map(c -> (X509Certificate) c).collect(Collectors.toList());
}
CollectionStore<X509CertificateHolder> createCollectionStore(List<X509Certificate> chain) {
return new CollectionStore<>(chain.stream().map(c -> {
try {
return new X509CertificateHolder(c.getEncoded());
} catch (IOException | CertificateEncodingException e) {
throw new RuntimeException(e);
}
}).collect(Collectors.toList()));
}
Пример кода наложения подписи на языке Java опубликован на github