Форум КриптоПро
»
Средства криптографической защиты информации
»
КриптоПро JCP, JavaTLS
»
javax.net.ssl.SSLHandshakeException: ru.CryptoPro.ssl.pc_4.cl_5: PKIX path building failed
Статус: Участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,964 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 704 раз в 665 постах
|
Здравствуйте. Нужно установить корневой сертификат серверной цепочки в /etc/ssl/certs/java/cacerts |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,964 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 704 раз в 665 постах
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 16.03.2021(UTC) Сообщений: 20 Сказал(а) «Спасибо»: 10 раз
|
Автор: Евгений Афанасьев спасибо за ответ, я добавил, но при попытке вывести список сертификатов в 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)
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 16.03.2021(UTC) Сообщений: 20 Сказал(а) «Спасибо»: 10 раз
|
при этом в tmf.getTrustManagers() всё есть, но в CertPathParameters в unmodTrustAnchors его нет
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,964 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 704 раз в 665 постах
|
Ошибка в keytool выше про unknown.size.1 - это ошибка в jdk, надо взять версию новее (если есть) или старше. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 16.03.2021(UTC) Сообщений: 20 Сказал(а) «Спасибо»: 10 раз
|
Автор: Евгений Афанасьев Ошибка в keytool выше про unknown.size.1 - это ошибка в jdk, надо взять версию новее (если есть) или старше. использую последний JDK 8 от Oracle. нужно именно под 8 версией. пробовал добавить другой сертификат, обычный(не ГОСТ): Код: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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,964 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 704 раз в 665 постах
|
Автор: long76 Автор: Евгений Афанасьев Ошибка в keytool выше про unknown.size.1 - это ошибка в jdk, надо взять версию новее (если есть) или старше. использую последний JDK 8 от Oracle. нужно именно под 8 версией. пробовал добавить другой сертификат, обычный(не ГОСТ): Код: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, в ней описаны отличия. |
|
1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
long76 оставлено 18.03.2021(UTC)
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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
|
|
|
|
Форум КриптоПро
»
Средства криптографической защиты информации
»
КриптоПро JCP, JavaTLS
»
javax.net.ssl.SSLHandshakeException: ru.CryptoPro.ssl.pc_4.cl_5: PKIX path building failed
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close