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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline long76  
#1 Оставлено : 16 марта 2021 г. 14:47:29(UTC)
long76

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

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

Сказал(а) «Спасибо»: 10 раз
OS: KDE NEON 5.21(Ubuntu 20.04) x64
JDK: Azul Zulu 8
openjdk version "1.8.0_282"
OpenJDK Runtime Environment (Zulu 8.52.0.23-CA-linux64) (build 1.8.0_282-b08)
OpenJDK 64-Bit Server VM (Zulu 8.52.0.23-CA-linux64) (build 25.282-b08, mixed mode)

CSP: 5.0.11455 (Fury) от 8.05.2019.
JCP: 2.0.41789


Здравствуйте, пытаюсь получить данные по GostTLS с https://cryptopro.ru.

Код такой:
Код:
try {
    KeyStore ks = KeyStore.getInstance("HDImageStore", "JCP");
    ks.load(null, null);

    KeyManagerFactory kmf = KeyManagerFactory.getInstance("GostX509");
    kmf.init(ks, "password".toCharArray());

    KeyStore trustedKeyStore = KeyStore.getInstance("JKS");
    trustedKeyStore.load(new FileInputStream("/etc/ssl/certs/java/cacerts"), "changeit".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();
    URL url = new URL("https://www.cryptopro.ru/");

    HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
    connection.setSSLSocketFactory(socketFactory);
    connection.connect();
    BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    StringBuilder sb = new StringBuilder();
    String str;
    while ((str = br.readLine()) != null) {
        sb.append(str).append("\n");
    }
    System.out.println(sb.toString());
} catch (Exception e) {
    e.printStackTrace();
}


Получаю ошибку:
Код:
мар 16, 2021 2:31:27 PM ru.CryptoPro.JCP.tools.Starter <init>
INFO: Loading JCP 2.0.41789
мар 16, 2021 2:31:27 PM ru.CryptoPro.JCP.tools.Starter <init>
INFO: JCP has been loaded.
мар 16, 2021 2:31:29 PM ru.CryptoPro.ssl.cl_39 <init>
INFO: %% adding as private keys %%
мар 16, 2021 2:31:29 PM ru.CryptoPro.ssl.cl_39 <init>
WARNING: %% No appropriate keys for handshake
PATH: /var/opt/cprocsp/keys/gl
мар 16, 2021 2:31:29 PM ru.CryptoPro.ssl.SSLContextImpl engineInit
INFO: SSLContextImpl init.
мар 16, 2021 2:31:29 PM ru.CryptoPro.ssl.SSLContextImpl engineInit
INFO: trigger seeding of SecureRandom
мар 16, 2021 2:31:29 PM ru.CryptoPro.ssl.SSLContextImpl engineInit
INFO: done seeding SecureRandom
мар 16, 2021 2:31:29 PM ru.CryptoPro.ssl.SSLContextImpl engineInit
INFO: SSLContextImpl initialized.
мар 16, 2021 2:31:30 PM ru.CryptoPro.ssl.SSLSocketImpl a
WARNING: main, handling exception: javax.net.ssl.SSLHandshakeException: ru.CryptoPro.ssl.pc_4.cl_5: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
javax.net.ssl.SSLHandshakeException: ru.CryptoPro.ssl.pc_4.cl_5: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at ru.CryptoPro.ssl.cl_2.a(Unknown Source)
	at ru.CryptoPro.ssl.SSLSocketImpl.a(Unknown Source)
	at ru.CryptoPro.ssl.cl_59.a(Unknown Source)
	at ru.CryptoPro.ssl.cl_59.a(Unknown Source)
	at ru.CryptoPro.ssl.cl_16.a(Unknown Source)
	at ru.CryptoPro.ssl.cl_16.a(Unknown Source)
	at ru.CryptoPro.ssl.cl_59.s(Unknown Source)
	at ru.CryptoPro.ssl.cl_59.a(Unknown Source)
	at ru.CryptoPro.ssl.SSLSocketImpl.a(Unknown Source)
	at ru.CryptoPro.ssl.SSLSocketImpl.n(Unknown Source)
	at ru.CryptoPro.ssl.SSLSocketImpl.b(Unknown Source)
	at ru.CryptoPro.ssl.SSLSocketImpl.startHandshake(Unknown Source)
	at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
	at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
	at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:167)
	at ru.krista.Main.main(Main.java:166)
Caused by: ru.CryptoPro.ssl.pc_4.cl_5: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at ru.CryptoPro.ssl.pc_4.cl_2.a(Unknown Source)
	at ru.CryptoPro.ssl.pc_4.cl_2.a(Unknown Source)
	at ru.CryptoPro.ssl.pc_4.cl_4.b(Unknown Source)
	at ru.CryptoPro.ssl.cl_121.a(Unknown Source)
	at ru.CryptoPro.ssl.cl_121.a(Unknown Source)
	at ru.CryptoPro.ssl.cl_121.checkServerTrusted(Unknown Source)
	... 12 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)
	at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)
	at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
	at ru.CryptoPro.reprov.CPCertPathBuilder.engineBuild(Unknown Source)
	at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
	... 18 more


Если сделать свой X509TrustManager, то ошибок нет.
Код:
private static final class DefaultTrustManager implements X509TrustManager {
    @Override
    public void checkClientTrusted(X509Certificate[] x509Certificates, String s) { }

    @Override
    public void checkServerTrusted(X509Certificate[] x509Certificates, String s) { }

    @Override
    public X509Certificate[] getAcceptedIssuers() { return null; }
}

sslContext.init(kmf.getKeyManagers(), new TrustManager[]{new DefaultTrustManager()}, null);


Как исправить ошибку?

Отредактировано пользователем 16 марта 2021 г. 15:06:11(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#2 Оставлено : 16 марта 2021 г. 18:42:34(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Здравствуйте.
Нужно установить корневой сертификат серверной цепочки в /etc/ssl/certs/java/cacerts
Offline long76  
#3 Оставлено : 17 марта 2021 г. 10:21:24(UTC)
long76

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

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

Сказал(а) «Спасибо»: 10 раз
Автор: Евгений Афанасьев Перейти к цитате
Здравствуйте.
Нужно установить корневой сертификат серверной цепочки в /etc/ssl/certs/java/cacerts


можете предоставить корневой сертификат у https://www.cryptopro.ru/? пробовал вытащить через Chromium Gost и просто через Google Chrome, не подходят видимо, раз ошибка повторяется. Выгружал в формате "Единый сертификат ASCII с кодировкой Base64".

сертификаты ставил в /usr/local/share/ca-certificates/, а потом sudo update-ca-certificates --fresh

сменил jdk 8 на oracle 281

в метод public final CertPathBuilderResult build(CertPathParameters params)
в params -> unmodTrustAnchors нет сертификата добавленного вручную

Код ошибки
Код:
мар 17, 2021 12:31:40 PM ru.CryptoPro.JCP.tools.Starter <init>
INFO: Loading JCP 2.0.41789
мар 17, 2021 12:31:40 PM ru.CryptoPro.JCP.tools.Starter <init>
INFO: JCP has been loaded.
мар 17, 2021 12:31:42 PM ru.CryptoPro.ssl.cl_39 <init>
WARNING: %% No appropriate keys for handshake
PATH: /var/opt/cprocsp/keys/gl
мар 17, 2021 12:31:42 PM ru.CryptoPro.ssl.SSLContextImpl engineInit
INFO: SSLContextImpl init.
мар 17, 2021 12:31:42 PM ru.CryptoPro.ssl.SSLContextImpl engineInit
INFO: trigger seeding of SecureRandom
мар 17, 2021 12:31:42 PM ru.CryptoPro.ssl.SSLContextImpl engineInit
INFO: done seeding SecureRandom
мар 17, 2021 12:31:42 PM ru.CryptoPro.ssl.SSLContextImpl engineInit
INFO: SSLContextImpl initialized.
мар 17, 2021 12:31:44 PM ru.CryptoPro.ssl.SSLSocketImpl a
WARNING: main, handling exception: javax.net.ssl.SSLHandshakeException: ru.CryptoPro.ssl.pc_4.cl_5: PKIX path building failed: ru.CryptoPro.reprov.certpath.JCPCertPathBuilderException: unable to find valid certification path to requested target
javax.net.ssl.SSLHandshakeException: ru.CryptoPro.ssl.pc_4.cl_5: PKIX path building failed: ru.CryptoPro.reprov.certpath.JCPCertPathBuilderException: unable to find valid certification path to requested target
	at ru.CryptoPro.ssl.cl_2.a(Unknown Source)
	at ru.CryptoPro.ssl.SSLSocketImpl.a(Unknown Source)
	at ru.CryptoPro.ssl.cl_59.a(Unknown Source)
	at ru.CryptoPro.ssl.cl_59.a(Unknown Source)
	at ru.CryptoPro.ssl.cl_16.a(Unknown Source)
	at ru.CryptoPro.ssl.cl_16.a(Unknown Source)
	at ru.CryptoPro.ssl.cl_59.s(Unknown Source)
	at ru.CryptoPro.ssl.cl_59.a(Unknown Source)
	at ru.CryptoPro.ssl.SSLSocketImpl.a(Unknown Source)
	at ru.CryptoPro.ssl.SSLSocketImpl.n(Unknown Source)
	at ru.CryptoPro.ssl.SSLSocketImpl.b(Unknown Source)
	at ru.CryptoPro.ssl.SSLSocketImpl.startHandshake(Unknown Source)
	at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:587)
	at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
	at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:167)
	at ru.krista.Main.main(Main.java:163)
Caused by: ru.CryptoPro.ssl.pc_4.cl_5: PKIX path building failed: ru.CryptoPro.reprov.certpath.JCPCertPathBuilderException: unable to find valid certification path to requested target
	at ru.CryptoPro.ssl.pc_4.cl_2.a(Unknown Source)
	at ru.CryptoPro.ssl.pc_4.cl_2.a(Unknown Source)
	at ru.CryptoPro.ssl.pc_4.cl_4.b(Unknown Source)
	at ru.CryptoPro.ssl.cl_121.a(Unknown Source)
	at ru.CryptoPro.ssl.cl_121.a(Unknown Source)
	at ru.CryptoPro.ssl.cl_121.checkServerTrusted(Unknown Source)
	... 12 more
Caused by: ru.CryptoPro.reprov.certpath.JCPCertPathBuilderException: unable to find valid certification path to requested target
	at ru.CryptoPro.reprov.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
	at ru.CryptoPro.reprov.CPCertPathBuilder.engineBuild(Unknown Source)
	at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
	... 18 more

Отредактировано пользователем 17 марта 2021 г. 12:33:29(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#4 Оставлено : 17 марта 2021 г. 13:45:34(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Если подключаетесь к https://www.cryptopro.ru/, то корневой - Минкомсвязь http://reestr-pki.ru/cdp/guc_gost12.crt
Если у вас хранилище доверенных корневых сертификатов, судя по коду в первом посте, /etc/ssl/certs/java/cacerts, то добавьте этот сертификат в него.
Offline long76  
#5 Оставлено : 17 марта 2021 г. 15:22:21(UTC)
long76

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

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

Сказал(а) «Спасибо»: 10 раз
Автор: Евгений Афанасьев Перейти к цитате
Если подключаетесь к https://www.cryptopro.ru/, то корневой - Минкомсвязь http://reestr-pki.ru/cdp/guc_gost12.crt
Если у вас хранилище доверенных корневых сертификатов, судя по коду в первом посте, /etc/ssl/certs/java/cacerts, то добавьте этот сертификат в него.


спасибо за ответ, я добавил, но при попытке вывести список сертификатов в cacerts ошибка

Код:
keytool -v -list -keystore /etc/ssl/certs/java/cacerts > list.txt


Код:
*******************************************


Alias name: debian:gostcryptopro.pem
Creation date: 17.03.2021
Entry type: trustedCertEntry

keytool error: java.util.MissingResourceException: Can't find resource for bundle sun.security.tools.keytool.Resources, key unknown.size.1
java.util.MissingResourceException: Can't find resource for bundle sun.security.tools.keytool.Resources, key unknown.size.1
	at java.util.ResourceBundle.getObject(ResourceBundle.java:450)
	at java.util.ResourceBundle.getString(ResourceBundle.java:407)
	at sun.security.tools.keytool.Main.withWeak(Main.java:3143)
	at sun.security.tools.keytool.Main.printX509Cert(Main.java:3178)
	at sun.security.tools.keytool.Main.doPrintEntry(Main.java:1988)
	at sun.security.tools.keytool.Main.doPrintEntries(Main.java:2290)
	at sun.security.tools.keytool.Main.doCommands(Main.java:1131)
	at sun.security.tools.keytool.Main.run(Main.java:379)
	at sun.security.tools.keytool.Main.main(Main.java:372)
Offline long76  
#6 Оставлено : 17 марта 2021 г. 17:34:24(UTC)
long76

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

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

Сказал(а) «Спасибо»: 10 раз
при этом в tmf.getTrustManagers() всё есть, но в CertPathParameters в unmodTrustAnchors его нет
Offline Евгений Афанасьев  
#7 Оставлено : 17 марта 2021 г. 18:08:10(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Ошибка в keytool выше про unknown.size.1 - это ошибка в jdk, надо взять версию новее (если есть) или старше.
Offline long76  
#8 Оставлено : 18 марта 2021 г. 9:25:18(UTC)
long76

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

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

Сказал(а) «Спасибо»: 10 раз
Автор: Евгений Афанасьев Перейти к цитате
Ошибка в keytool выше про unknown.size.1 - это ошибка в jdk, надо взять версию новее (если есть) или старше.


использую последний JDK 8 от Oracle. нужно именно под 8 версией.
UserPostedImage

пробовал добавить другой сертификат, обычный(не ГОСТ):

Код:
Enter keystore password:  
Certificate already exists in keystore under alias <debian:sysadmin.pem>
Do you still want to add it? [no]:  no
Certificate was not added to keystore


но при добавлении ГОСТ:

Код:
Enter keystore password:  
keytool error: java.util.MissingResourceException: Can't find resource for bundle sun.security.tools.keytool.Resources, key unknown.size.1


видимо у keytool нет поддержки гостовских ключей(не смотря на то что JCP установлен). как её добавить?

Заранее спасибо.

P.S. планируется ли добавление в maven репозиторий криптопровайдера чтобы его можно было добавить в рантайм без интеграции в сам jdk? что-то вроде
Код:
Security.addProvider(new CryptoProProvider())

Отредактировано пользователем 18 марта 2021 г. 9:26:15(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#9 Оставлено : 18 марта 2021 г. 9:36:10(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Автор: long76 Перейти к цитате
Автор: Евгений Афанасьев Перейти к цитате
Ошибка в keytool выше про unknown.size.1 - это ошибка в jdk, надо взять версию новее (если есть) или старше.


использую последний JDK 8 от Oracle. нужно именно под 8 версией.
UserPostedImage

пробовал добавить другой сертификат, обычный(не ГОСТ):

Код:
Enter keystore password:  
Certificate already exists in keystore under alias <debian:sysadmin.pem>
Do you still want to add it? [no]:  no
Certificate was not added to keystore


но при добавлении ГОСТ:

Код:
Enter keystore password:  
keytool error: java.util.MissingResourceException: Can't find resource for bundle sun.security.tools.keytool.Resources, key unknown.size.1


видимо у keytool нет поддержки гостовских ключей(не смотря на то что JCP установлен). как её добавить?

Заранее спасибо.

P.S. планируется ли добавление в maven репозиторий криптопровайдера чтобы его можно было добавить в рантайм без интеграции в сам jdk? что-то вроде
Код:
Security.addProvider(new CryptoProProvider())

1. По поводу key unknown.size.1 - это ошибка в jdk, разработчики забыли добавить этот ресурс. ресурс нужен для вывода размера ключей, которые неизвестны java (например, ГОСТ). В более ранних версиях jdk этой проблемы нет.
2. По поводу tls - попробуйте альтернативный вариант с CertStore. CertStore - формат хранилища сертификатов, реализованный в JCP. Аналог JKS (cacerts). Описание хранилища и как его создать/добавить сертификат - есть в документации JCP (Doc). Например, в панели JCP можно создать, или через keytool. Добавьте в это хранилище корневой Минкомсвязь, упомянутый выше. Затем такое хранилище вы можете указать в коде вместо /etc/ssl/certs/java/cacerts.
3. Если хочется добавлять провайдеры с помощью Security.addProvider и без установки (вроде bouncycastle), то нужно использовать версию JCP A-версии, 2.0-A для java 10+ (в разделе скачивания рядом с JCP 2.0). Она не требует установки, в проект добавляете только jar файлы (в неизменном виде), провайдеры добавляются с помощью Security.addProvider. Одно из важных отличий от 2.0 для java 7-8 - настройки хранятся под тем пользователем, под которым запускаете код. В дистрибутиве 2.0-А есть документация, аналогичная 2.0, в ней описаны отличия.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
long76 оставлено 18.03.2021(UTC)
Offline long76  
#10 Оставлено : 18 марта 2021 г. 12:20:57(UTC)
long76

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

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

Сказал(а) «Спасибо»: 10 раз
Большое спасибо за помощь, в oracle сообщил баг 8263817. Всё работает на версии JDK 8u192 от Oracle.

В конечном итоге код такой:

Код:
try {
    System.setProperty("com.sun.security.enableCRLDP", "true");
    KeyStore ks = KeyStore.getInstance("HDImageStore", "JCP");
    ks.load(null, null);

    KeyManagerFactory kmf = KeyManagerFactory.getInstance("GostX509");
    kmf.init(ks, "password".toCharArray());

    KeyStore trustedKeyStore = KeyStore.getInstance("JKS");
    trustedKeyStore.load(new FileInputStream("/etc/ssl/certs/java/cacerts"), "changeit".toCharArray());

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

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

    SSLSocketFactory socketFactory = sslContext.getSocketFactory();
    URL url = new URL("https://www.cryptopro.ru/");

    HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
    connection.setSSLSocketFactory(socketFactory);
    connection.connect();
    BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    StringBuilder sb = new StringBuilder();
    String str;
    while ((str = br.readLine()) != null) {
        sb.append(str).append("\n");
    }
    System.out.println(sb.toString());
} catch (Exception e) {
    e.printStackTrace();
}


в таком случае добавлять сертификат в cacerts не надо как я понял, т.к. происходит онлайн. Если убрать
Код:
System.setProperty("com.sun.security.enableCRLDP", "true");


то будет ошибка

Код:
java.security.GeneralSecurityException: Online certificate verification is enabled but com.sun.security.enableCRLDP = false (Sun), com.ibm.security.enableCRLDP = false (Ibm), and offline certificate verification is disabled, and ManagerFactoryParameters are null.


как сделать чтобы проверка была из cacerts? т.к. есть вероятность, что проверять сертификаты через интернет на боевом сервере будет невозможно

Отредактировано пользователем 18 марта 2021 г. 17:28:51(UTC)  | Причина: неверный номер бага oracle

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