Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline BlackHawk  
#1 Оставлено : 21 мая 2021 г. 13:18:27(UTC)
BlackHawk

Статус: Новичок

Группы: Участники
Зарегистрирован: 19.05.2021(UTC)
Сообщений: 1
Российская Федерация
Откуда: Москва

Добрый день!

Пилим интеграцию с веб-сервисом НБКИ, по новому стандарту требуется двусторонняя аутентификация. Перелопатил множество тем на этом форуме, победить пока не получается d'oh!

Наше приложение на SpringBoot,хотим ограничиться использованием JCP, без CSP.


С стороны НБКИ предоставлены тестовый сертификат .cer, корневой .p7b (УЦ криптопро) и набор ключей .key.

По дебагу смотрел - keystore.load(null, null) вычитывает приватные ключи, есть возможность получить X509 сертификат и PrivateKey. Они используются дальше при подписании и шифровании тела запроса, но не ясно как сконфигурить TLS, пока стабильно валится либо javax.net.ssl.SSLHandshakeException: Received fatal alert: HANDSHAKE_FAILURE, либо
Caused by: javax.net.ssl.SSLException: Received fatal alert: protocol_version



Пробовал вычитать корневой сертификат (.p7b) кейстором напрямую из файла - падает с Caused by: java.io.IOException: Invalid key store format.
Код:

trustStore.load(new FileInputStream("cert/cacertroot.p7b"), null);




В логах так же нашел вот это - WARN ru.CryptoPro.ssl.SSLLogger - %% No appropriate keys for handshake


Перепробовал уже самые различные варианты конфигурации, ничего не помогает. Можете проконсультировать? Brick wall


Код:

@Bean
    public SSLContext sslContext(CryptoProProperties properties) throws Exception {
        System.setProperty("com.sun.security.enableCRLDP", "false");
        System.setProperty("ru.CryptoPro.ssl.SSLLogger.level", "ALL");
        cpSSLConfig.setDefaultSSLProvider(JCP.PROVIDER_NAME);

        HDImageStore.setDir(properties.getKeyStorePath());


        KeyStore keyStore = KeyStore.getInstance(JCP.HD_STORE_NAME, JCP.PROVIDER_NAME);
        keyStore.load(null, null);

        KeyManagerFactory kmf = KeyManagerFactory.getInstance("GostX509");
        kmf.init(keyStore, properties.getKeyPassword().toCharArray());

        var trustStore = KeyStore.getInstance(JCP.CERT_STORE_NAME);
        trustStore.load(null, null);

        TrustManagerFactory tmf = TrustManagerFactory.getInstance("GostX509");
        tmf.init(trustStore);

        SSLContext sslContext = SSLContext.getInstance("GostTLS");
        sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

        return sslContext;
    }



Offline Евгений Афанасьев  
#2 Оставлено : 21 мая 2021 г. 23:50:16(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,924
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 690 раз в 651 постах
Здравствуйте.
1.
Автор: BlackHawk Перейти к цитате

стабильно валится либо javax.net.ssl.SSLHandshakeException: Received fatal alert: HANDSHAKE_FAILURE, либо
Caused by: javax.net.ssl.SSLException: Received fatal alert: protocol_version

Соберите и приложите полные логи для JTLS (SSLLogger с уровнем ALL).
По поводу Received fatal alert: protocol_version - можно попробовать SSLContext.getInstance("GostTLSv.1.2"); вместо GostTLS.

2.
Автор: BlackHawk Перейти к цитате

Пробовал вычитать корневой сертификат (.p7b) кейстором напрямую из файла - падает с Caused by: java.io.IOException: Invalid key store format.

Так как это сертификат, а ожидается хранилище заданного формата JCP.CERT_STORE_NAME. Прочитайте сертификат из файла, как X509Certificate, и положите в trustStore:
Код:

cert = CertificateFactory.getInstance("X.509").generateCertificates(new FileInputStream("cert/cacertroot.p7b")); // скорее всего, generateCertificates, т.к. p7b
var trustStore = KeyStore.getInstance(JCP.CERT_STORE_NAME);
trustStore.load(null, null);
trustStore.setCertificateEntry("root", cert);


3.
Автор: BlackHawk Перейти к цитате

В логах так же нашел вот это - WARN ru.CryptoPro.ssl.SSLLogger - %% No appropriate keys for handshake

Не найден ключевой контейнер заданного типа JCP.HD_STORE_NAME с паролем properties.getKeyPassword().toCharArray(). Ключевой контейнер в виде, условно, xxxxxxxx.000 действительно есть в папке properties.getKeyStorePath()? Например, ваш контейнер mykey.000 в папке C:\temp, т.е. properties.getKeyStorePath() при этом C:\temp. Если все верно, то в контейнере есть сертификат? Сертификат не истек? Пароль properties.getKeyPassword() подходит к контейнеру? У приложения есть права на чтение/запись из/в properties.getKeyStorePath()?

Отредактировано пользователем 21 мая 2021 г. 23:52:43(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.