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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline AlexanderD  
#1 Оставлено : 27 августа 2018 г. 19:13:58(UTC)
AlexanderD

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

Группы: Участники
Зарегистрирован: 27.08.2018(UTC)
Сообщений: 2

Добрый день!

Подскажите что не так.
Есть код

Код:


        URL url = new URL(dssURL);

        KeyStore keyStore = KeyStore.getInstance("HDImageStore", "JCP");
        keyStore.load(null, KEY_PASSWORD.toCharArray());
        KeyManagerFactory kmf = KeyManagerFactory.getInstance("GostX509");
        kmf.init(keyStore, KEY_PASSWORD.toCharArray());

        
        //      Первый блок
        KeyStore trustedKeyStore = KeyStore.getInstance("JKS");
        trustedKeyStore.load(new FileInputStream(TRUST_CERT_FILE), TRUST_PASSWORD.toCharArray());
        TrustManagerFactory tmf = TrustManagerFactory.getInstance("GostX509");
        tmf.init(trustedKeyStore);
        
        //      Второй блок  
//        System.setProperty("javax.net.ssl.trustStoreType", "JKS");
//        System.setProperty("javax.net.ssl.trustStore", TRUST_CERT_FILE);
//        System.setProperty("javax.net.ssl.trustStorePassword", TRUST_PASSWORD);

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

        HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
        con.setDefaultSSLSocketFactory(socketFactory);

        con.connect();


В результате его выполнения получаю:

Код:

Caused by: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
	at java.security.cert.PKIXParameters.setTrustAnchors(PKIXParameters.java:200)



Но, если раскоментировать второй блок, т.е. установка трастового хранилища пропертями, то все работает!
Как сделать так чтобы работало через первый блок, т.е. через созданный трастменеджер?

Спасибо!

Отредактировано пользователем 27 августа 2018 г. 19:14:41(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#2 Оставлено : 28 августа 2018 г. 13:09:52(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 705 раз в 666 постах
Здравствуйте.
Код должен выглядеть примерно так:
Код:

        System.setProperty("com.sun.security.enableCRLDP", "true");
        URL url = new URL("https://testgost2012st.cryptopro.ru/gost2st.txt");

        KeyStore keyStore = KeyStore.getInstance("HDImageStore", "JCP");
        keyStore.load(null, null);

        KeyManagerFactory kmf = KeyManagerFactory.getInstance("GostX509");
        kmf.init(keyStore, "1".toCharArray()); // пароль для подбора контейнера

        KeyStore trustedKeyStore = KeyStore.getInstance("JKS");
        trustedKeyStore.load(new FileInputStream("store.jks"), "123456".toCharArray());

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

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

        SSLSocketFactory socketFactory = sslContext.getSocketFactory();

        HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
        connection.setSSLSocketFactory(socketFactory); // не HttpsURLConnection.setDefaultSSLSocketFactory!

        connection.connect();
        print_content(connection);

        connection.disconnect();
        System.out.println("OK");

Когда используется setDefaultSSLSocketFactory, то все работает несколько иначе: у SSLSocketFactory вызывается DefaultSSLContext без учета ранее настроенного SSLContext, который пытается получить trust store из настроек System.Properties, их нет - тогда по умолчанию в качестве trust store используется HDImageStore (если есть System.Properties - trust store грузится из настроек).
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
Санчир Момолдаев оставлено 07.08.2020(UTC)
Offline AlexanderD  
#3 Оставлено : 28 августа 2018 г. 14:43:32(UTC)
AlexanderD

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

Группы: Участники
Зарегистрирован: 27.08.2018(UTC)
Сообщений: 2

Все заработало, спасибо огромное, кучу времени сэкономили!
Offline Oleg Frolov  
#4 Оставлено : 15 сентября 2020 г. 19:32:49(UTC)
Oleg Frolov

Статус: Участник

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

Сказал(а) «Спасибо»: 6 раз
Добрый день!

Подскажите, пожалуйста.

Есть такой код:

Код:
URL url = new URL("https://dss.cryptopro.ru/verify/rest/api/certificates");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "application/json; charset=utf-8");
connection.connect();


Если установлен JCP без TLS провайдера, либо JCP не установлен вообще, то соединение успешно (далее в коде отправляю запрос, получаю ответ).

Но, если установлен JCP вместе с TLS провайдером, то получаю ошибку "TrustAnchors parameter must be non-empty".
Как я понимаю, если установлен TLS провайдер, то в коде необходимо добавить trustedKeyStore и keyStore.
Но в данном случае я не хочу добавлять никаких хранилищ.

Нужно, чтобы код работал также как и до установки TLS провайдера. Что необходимо для этого сделать?
Почему после установки TLS провайдера появляется эта ошибка?

JCP v2.0
Windows 7

Отредактировано пользователем 15 сентября 2020 г. 19:33:54(UTC)  | Причина: Не указана

Offline Санчир Момолдаев  
#5 Оставлено : 15 сентября 2020 г. 19:51:38(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 100 раз
Поблагодарили: 275 раз в 255 постах
Автор: Oleg Frolov Перейти к цитате
Добрый день!

Подскажите, пожалуйста.

Есть такой код:

Код:
URL url = new URL("https://dss.cryptopro.ru/verify/rest/api/certificates");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "application/json; charset=utf-8");
connection.connect();


Если установлен JCP без TLS провайдера, либо JCP не установлен вообще, то соединение успешно (далее в коде отправляю запрос, получаю ответ).

Но, если установлен JCP вместе с TLS провайдером, то получаю ошибку "TrustAnchors parameter must be non-empty".
Как я понимаю, если установлен TLS провайдер, то в коде необходимо добавить trustedKeyStore и keyStore.
Но в данном случае я не хочу добавлять никаких хранилищ.

Нужно, чтобы код работал также как и до установки TLS провайдера. Что необходимо для этого сделать?
Почему после установки TLS провайдера появляется эта ошибка?

JCP v2.0
Windows 7


Добрый день!
установите JCP + cpSSL (JTLS)
далее необходимо отменить изменения которые внес cpSSL
в java.security найдите следующие параметры и измените их значение:
ssl.KeyManagerFactory.algorithm=SunX509
ssl.TrustManagerFactory.algorithm=PKIX
ssl.SocketFactory.provider=
ssl.ServerSocketFactory.provider=

если нужно использовать гост тлс в коде то можно установить их программно:
Security.setProperty("ssl.SocketFactory.provider", "ru.CryptoPro.ssl.SSLSocketFactoryImpl")
Security.setProperty("ssl.ServerSocketFactory.provider", "ru.CryptoPro.ssl.SSLServerSocketFactoryImpl")
Security.setProperty("ssl.KeyManagerFactory.algorithm", "GostX509")
Security.setProperty("ssl.TrustManagerFactory.algorithm", "GostX509")

либо делать connection.setSSLSocketFactory(ctx.getSocketFactory()); для гостовых тлс соединений

Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Санчир Момолдаев за этот пост.
Oleg Frolov оставлено 16.09.2020(UTC)
Offline Oleg Frolov  
#6 Оставлено : 16 сентября 2020 г. 11:58:40(UTC)
Oleg Frolov

Статус: Участник

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

Сказал(а) «Спасибо»: 6 раз
Автор: Санчир Момолдаев Перейти к цитате
Автор: Oleg Frolov Перейти к цитате
Добрый день!

Подскажите, пожалуйста.

Есть такой код:

Код:
URL url = new URL("https://dss.cryptopro.ru/verify/rest/api/certificates");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "application/json; charset=utf-8");
connection.connect();


Если установлен JCP без TLS провайдера, либо JCP не установлен вообще, то соединение успешно (далее в коде отправляю запрос, получаю ответ).

Но, если установлен JCP вместе с TLS провайдером, то получаю ошибку "TrustAnchors parameter must be non-empty".
Как я понимаю, если установлен TLS провайдер, то в коде необходимо добавить trustedKeyStore и keyStore.
Но в данном случае я не хочу добавлять никаких хранилищ.

Нужно, чтобы код работал также как и до установки TLS провайдера. Что необходимо для этого сделать?
Почему после установки TLS провайдера появляется эта ошибка?

JCP v2.0
Windows 7


Добрый день!
установите JCP + cpSSL (JTLS)
далее необходимо отменить изменения которые внес cpSSL
в java.security найдите следующие параметры и измените их значение:
ssl.KeyManagerFactory.algorithm=SunX509
ssl.TrustManagerFactory.algorithm=PKIX
ssl.SocketFactory.provider=
ssl.ServerSocketFactory.provider=

если нужно использовать гост тлс в коде то можно установить их программно:
Security.setProperty("ssl.SocketFactory.provider", "ru.CryptoPro.ssl.SSLSocketFactoryImpl")
Security.setProperty("ssl.ServerSocketFactory.provider", "ru.CryptoPro.ssl.SSLServerSocketFactoryImpl")
Security.setProperty("ssl.KeyManagerFactory.algorithm", "GostX509")
Security.setProperty("ssl.TrustManagerFactory.algorithm", "GostX509")

либо делать connection.setSSLSocketFactory(ctx.getSocketFactory()); для гостовых тлс соединений



Теперь ясно где были изменения. Все работает. Спасибо!
Offline distep2  
#7 Оставлено : 29 октября 2024 г. 13:09:45(UTC)
distep2

Статус: Участник

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

Сказал(а) «Спасибо»: 1 раз
Добрый день! Столкнулся с подобной проблемой используя корневой сертификат Госзнака.

Нашел что из-за такой проверки сертификат не добавляется:

Код:


static boolean a(X509Certificate var0) {
        X500Principal var1 = var0.getSubjectX500Principal();
        X500Principal var2 = var0.getIssuerX500Principal();
        return var1.equals(var2);
    }



в моем случае Issuer

CN=CryptoPro TLS CA, O="LLC \"Crypto-Pro\"", L=Moscow, ST=Moscow, C=RU, OID.1.2.643.100.1=#120d31303337373030303835343434, OID.1.2.643.100.4=#120a37373137313037393931

при этом Subject

CN="АО \"Гознак\"", C=RU, ST=78 г. Санкт-Петербург, L=Санкт-Петербург, O="АО \"Гознак\"", EMAILADDRESS=mtg_oib@goznak.ru


при этом отправляя с этим сертификатом запросы через stunnel все работает корректно. Что делать с такими сертификатами?

Отредактировано пользователем 29 октября 2024 г. 13:20:03(UTC)  | Причина: Не указана

Offline Санчир Момолдаев  
#8 Оставлено : 29 октября 2024 г. 13:50:58(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 100 раз
Поблагодарили: 275 раз в 255 постах
в trustAnchors должны быть именно корневые сертификаты + промежуточные для удаленного сертификата веб-сервера. сам сертификат веб-сервера не должен быть добавлен в доверенное хранилище, только его цепочка.
указанный вами сертификат - не корневой самоподписанный.
Техническую поддержку оказываем тут
Наша база знаний
Offline distep2  
#9 Оставлено : 29 октября 2024 г. 16:07:12(UTC)
distep2

Статус: Участник

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

Сказал(а) «Спасибо»: 1 раз
да, уже разобрался. У меня была вся цепочка сертификатов в одном файле, но setCertificateEntry добавляет по одному сертификату. В итоге просто разбил на разные файлы и добавил каждый отдельно. Но теперь другая ошибка

Код:

FINE: Master Secret:  ru.CryptoPro.JCSP.Key.MasterSecret@364f0a6f
Oct 29, 2024 2:29:59 PM ru.CryptoPro.ssl.cl_64 a
FINE: Client MAC write Secret:  ru.CryptoPro.JCSP.Key.GostSecretKey@27585962
Oct 29, 2024 2:29:59 PM ru.CryptoPro.ssl.cl_64 a
FINE: Server MAC write Secret:  ru.CryptoPro.JCSP.Key.GostSecretKey@1bee8888
Oct 29, 2024 2:29:59 PM ru.CryptoPro.ssl.cl_64 a
FINE: Client write key:  ru.CryptoPro.JCSP.Key.GostSecretKey@3a6ba61b
Oct 29, 2024 2:29:59 PM ru.CryptoPro.ssl.cl_64 a
FINE: Server write key:  ru.CryptoPro.JCSP.Key.GostSecretKey@7439cf4b
Oct 29, 2024 2:29:59 PM ru.CryptoPro.ssl.cl_64 a
ALL: Client write IV: 
0000: 53 7E E3 2C 4B D7 7A 4B                            S..,K.zK

Oct 29, 2024 2:29:59 PM ru.CryptoPro.ssl.cl_64 a
ALL: Server write IV: 
0000: 0D F6 25 31 B9 B8 EE 75                            ..%1...u

Oct 29, 2024 2:29:59 PM ru.CryptoPro.ssl.cl_80 a
FINER: main, WRITE: TLSv1 Change Cipher Spec, length = 1
Oct 29, 2024 2:29:59 PM ru.CryptoPro.ssl.cl_80 a
ALL: [Raw write]: length =  6 
0000: 14 03 01 00 01 01                                  ......

Oct 29, 2024 2:29:59 PM ru.CryptoPro.ssl.cl_7 <init>
FINER: Fixed IV = 53 7E E3 2C 4B D7 7A 4B
Oct 29, 2024 2:29:59 PM ru.CryptoPro.ssl.cl_48 f
FINE: *** Finished
verify_data:  { 23, 72, 123, 185, 141, 192, 155, 110, 236, 160, 212, 103 }
***

Oct 29, 2024 2:29:59 PM ru.CryptoPro.ssl.cl_80 a
ALL: [write] GOST hashes: len =  16 
0000: 14 00 00 0C 17 48 7B B9   8D C0 9B 6E EC A0 D4 67  .....H.....n...g

Oct 29, 2024 2:29:59 PM ru.CryptoPro.ssl.cl_80 a
FINE: MAC computed: 12 37 00 05
Oct 29, 2024 2:29:59 PM ru.CryptoPro.ssl.cl_7 a
FINE: Begin encrypt... 
Oct 29, 2024 2:29:59 PM ru.CryptoPro.ssl.cl_7 a
ALL: Plaintext before ENCRYPTION: len =  20 
0000: 14 00 00 0C 17 48 7B B9   8D C0 9B 6E EC A0 D4 67  .....H.....n...g
0010: 12 37 00 05                                        .7..

Oct 29, 2024 2:29:59 PM ru.CryptoPro.ssl.cl_7 a
FINE: Encrypted... 
Oct 29, 2024 2:29:59 PM ru.CryptoPro.ssl.cl_80 a
ALL: [Raw write]: length =  25 
0000: 16 03 01 00 14 4B BE 73   E9 0F 95 D4 75 E2 DC 3E  .....K.s....u..>
0010: DA B5 67 14 CC 16 FC FA   37                       ..g.....7

Oct 29, 2024 2:29:59 PM ru.CryptoPro.ssl.cl_69 a
ALL: [Raw read]: length =  5 
0000: 15 03 01 00 02                                     .....

Oct 29, 2024 2:29:59 PM ru.CryptoPro.ssl.cl_69 a
ALL: [Raw read]: length =  2 
0000: 02 28                                              .(

Oct 29, 2024 2:29:59 PM ru.CryptoPro.ssl.cl_69 b
FINER: main, READ: TLSv1 Alert, length = 2
Oct 29, 2024 2:29:59 PM ru.CryptoPro.ssl.SSLSocketImpl b
FINE: main, RECV TLSv1 ALERT:  fatal,  description = handshake_failure
Oct 29, 2024 2:29:59 PM ru.CryptoPro.ssl.SSLSessionImpl invalidate
FINE: %% Invalidated: {0} [Session-1, TLS_CIPHER_2012]
Oct 29, 2024 2:29:59 PM ru.CryptoPro.ssl.SSLSocketImpl i
FINE: main called closeSocket()
Oct 29, 2024 2:29:59 PM ru.CryptoPro.ssl.SSLSocketImpl a
WARNING: main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
[2024-10-29 19:29:59,544] WARN  [SSLLogger] [main] [] main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

	at ru.CryptoPro.ssl.Alerts.getSSLException(Unknown Source)


подскажете куда тут копать?

Отредактировано пользователем 29 октября 2024 г. 17:47:19(UTC)  | Причина: добавил деталей в логи

Offline Санчир Момолдаев  
#10 Оставлено : 29 октября 2024 г. 17:51:25(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 100 раз
Поблагодарили: 275 раз в 255 постах
попробуйте GostTLSv1.2
возможно на той стороне выключен tls 1.0
и укажите адрес куда стучитесь
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.