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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline billGilbert  
#1 Оставлено : 12 декабря 2023 г. 22:47:38(UTC)
billGilbert

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

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

Сказал(а) «Спасибо»: 3 раз
Использовал пример из папки samples-sources

Код:


public class Application {
    public static void main(String[] args) throws Exception {
        try {
            Security.addProvider(new JCSP()); // провайдер JCSP
        } catch (Exception e) {
            System.err.println("Exception in initializing crypto pro : "+ e);
        } catch (Error er) {
            System.err.println("Error in initializing crypto pro : "+ er);
        }

        try {

            System.setProperty("com.sun.security.enableCRLDP", "true");
            // Отладка
            System.setProperty("javax.net.debug", "ssl:handshake");
            System.setProperty("https.protocols", "TLSv1.2");
            System.setProperty("jdk.tls.client.protocols", "TLSv1.2");
            System.setProperty("https.default.protocol", "TLS");
            System.setProperty("https.socket.protocols", "TLSv1");

            SSLContext sslCtx = SSLContext.getInstance("GostTLS");
            InputStream cacerts = Application.class.getClassLoader().getResourceAsStream("cacerts");
            InputStream p12Cert = Application.class.getClassLoader().getResourceAsStream("p12.pfx");

            TrustManager[] trustManagers = getTrustManagers("jks", cacerts, "changeit");
            KeyManager[] keyManagers = getKeyManagers(JCSP.PFX_STORE_NAME, p12Cert, "password");

            sslCtx.init(keyManagers, trustManagers, null);
            SSLSocketFactory socketFactory = sslCtx.getSocketFactory();

            URL url = new URL("https://bki-b2b-test.scoring.ru/cr4.php");
            HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
            connection.setSSLSocketFactory(socketFactory);
            connection.connect();
            connection.disconnect();
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        log.info("Connection was successfully");
    }

    protected static KeyManager[] getKeyManagers(String keyStoreType, InputStream keyStoreFile, String keyStorePassword) throws Exception {
        KeyStore keyStore = KeyStore.getInstance(keyStoreType);
        keyStore.load(keyStoreFile, keyStorePassword.toCharArray());
        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        kmf.init(keyStore, keyStorePassword.toCharArray());
        return kmf.getKeyManagers();
    }

    protected static TrustManager[] getTrustManagers(String trustStoreType, InputStream trustStoreFile, String trustStorePassword) throws Exception {
        KeyStore trustStore = KeyStore.getInstance(trustStoreType);
        trustStore.load(trustStoreFile, trustStorePassword.toCharArray());
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(trustStore);
        return tmf.getTrustManagers();
    }
}


получаю ошибку в строчке connection.connect()

Код:
WARNING: main, handling exception: java.lang.UnsupportedOperationException
javax.net.ssl.SSLException: java.lang.UnsupportedOperationException
	at ru.CryptoPro.ssl.cl_3.a(Unknown Source)
	at ru.CryptoPro.ssl.SSLSocketImpl.a(Unknown Source)
	at ru.CryptoPro.ssl.SSLSocketImpl.a(Unknown Source)
	at ru.CryptoPro.ssl.SSLSocketImpl.a(Unknown Source)
	at ru.CryptoPro.ssl.SSLSocketImpl.b(Unknown Source)
	at ru.CryptoPro.ssl.SSLSocketImpl.startHandshake(Unknown Source)
	at java.base/sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:567)
	at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
	at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:168)
	at ru.pglukhov.security.Application.main(Application.java:55)
Caused by: java.lang.UnsupportedOperationException
	at java.base/javax.net.ssl.ExtendedSSLSession.getStatusResponses(ExtendedSSLSession.java:157)
	at java.base/sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:220)
	at java.base/sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:129)
	at ru.CryptoPro.ssl.cl_18.a(Unknown Source)
	at ru.CryptoPro.ssl.cl_18.a(Unknown Source)
	at ru.CryptoPro.ssl.cl_66.u(Unknown Source)
	at ru.CryptoPro.ssl.cl_66.a(Unknown Source)
	at ru.CryptoPro.ssl.SSLSocketImpl.a(Unknown Source)
	at ru.CryptoPro.ssl.SSLSocketImpl.o(Unknown Source)
	... 6 more

Offline Евгений Афанасьев  
#2 Оставлено : 13 декабря 2023 г. 10:41:53(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Здравствуйте.
Используйте не
Код:

KeyManagerFactory.getDefaultAlgorithm()
TrustManagerFactory.getDefaultAlgorithm()

а "Gost509".
Offline billGilbert  
#3 Оставлено : 13 декабря 2023 г. 13:31:24(UTC)
billGilbert

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

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

Сказал(а) «Спасибо»: 3 раз
Автор: Евгений Афанасьев Перейти к цитате
Здравствуйте.
Используйте не
Код:

KeyManagerFactory.getDefaultAlgorithm()
TrustManagerFactory.getDefaultAlgorithm()

а "Gost509".


Сделал как вы сказали


Код:
public class Application {
    public static void main(String[] args) throws Exception {
        try {
            Security.addProvider(new JCSP()); // провайдер JCSP
            Security.addProvider(new JCP()); // провайдер JCP
            Security.addProvider(new RevCheck());
        } catch (Exception e) {
            System.err.println("Exception in initializing crypto pro : "+ e);
        } catch (Error er) {
            System.err.println("Error in initializing crypto pro : "+ er);
        }

        try {

            System.setProperty("com.sun.security.enableCRLDP", "true");
            // Отладка
            System.setProperty("javax.net.debug", "ssl:handshake");
            System.setProperty("https.protocols", "TLSv1.2");
            System.setProperty("jdk.tls.client.protocols", "TLSv1.2");
            System.setProperty("https.default.protocol", "TLS");
            System.setProperty("https.socket.protocols", "TLSv1");

            SSLContext sslCtx = SSLContext.getInstance("GostTLS");
            InputStream cacerts = Application.class.getClassLoader().getResourceAsStream("cacerts");
            InputStream p12Cert = Application.class.getClassLoader().getResourceAsStream("p12.pfx");

            TrustManager[] trustManagers = getTrustManagers("jks", cacerts, "changeit");
            KeyManager[] keyManagers = getKeyManagers(JCSP.PFX_STORE_NAME, p12Cert, "password");

            sslCtx.init(keyManagers, trustManagers, null);
            SSLSocketFactory socketFactory = sslCtx.getSocketFactory();

            URL url = new URL("https://bki-b2b-test.scoring.ru/cr4.php");
            HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
            connection.setSSLSocketFactory(socketFactory);
            connection.connect();
            connection.disconnect();
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        log.info("Connection was successfully");
    }

    protected static KeyManager[] getKeyManagers(String keyStoreType, InputStream keyStoreFile, String keyStorePassword) throws Exception {
        KeyStore keyStore = KeyStore.getInstance(keyStoreType);
        keyStore.load(keyStoreFile, keyStorePassword.toCharArray());
        KeyManagerFactory kmf = KeyManagerFactory.getInstance("Gost509");
        kmf.init(keyStore, keyStorePassword.toCharArray());
        return kmf.getKeyManagers();
    }

    protected static TrustManager[] getTrustManagers(String trustStoreType, InputStream trustStoreFile, String trustStorePassword) throws Exception {
        KeyStore trustStore = KeyStore.getInstance(trustStoreType);
        trustStore.load(trustStoreFile, trustStorePassword.toCharArray());
        TrustManagerFactory tmf = TrustManagerFactory.getInstance("Gost509");
        tmf.init(trustStore);
        return tmf.getTrustManagers();
    }
}



но получил
java.security.NoSuchAlgorithmException: Gost509 TrustManagerFactory not available.


RevCheck добавил т.к. видел в другом посте что используется GostX509 и так же его пробовал использовать. Но там так же ошибка была, поэтому решил Gost509 добить.

В cacert у меня используется обычное хранилище, что скопировал из папки JDK, но добавил туда сертификаты, которые мне прислали из Equifax.
в P12.pfx лежит сертификат, которые мне дали для доступа в их сервисы.



Offline Евгений Афанасьев  
#4 Оставлено : 13 декабря 2023 г. 14:10:36(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Автор: billGilbert Перейти к цитате
NoSuchAlgorithmException: Gost509 TrustManagerFactory not available

Добавьте и TLS провайдер тогда:
Цитата:

Security.addProvider(new Provider()); // пакет ru.CryptoPro.ssl модуля cpSSL.jar
Offline billGilbert  
#5 Оставлено : 13 декабря 2023 г. 15:11:16(UTC)
billGilbert

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

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

Сказал(а) «Спасибо»: 3 раз
Автор: Евгений Афанасьев Перейти к цитате
Автор: billGilbert Перейти к цитате
NoSuchAlgorithmException: Gost509 TrustManagerFactory not available

Добавьте и TLS провайдер тогда:
Цитата:

Security.addProvider(new Provider()); // пакет ru.CryptoPro.ssl модуля cpSSL.jar


Та же ошибка, но когда поставил GostX509


То получил эту ошибку

Цитата:
javax.net.ssl|ALL|01|main|2023-12-13 15:04:35.212 MSK|SSLContextImpl.java:119|done seeding of SecureRandom
дек. 13, 2023 3:04:35 PM ru.CryptoPro.ssl.SSLSocketImpl a
WARNING: main, handling exception: javax.net.ssl.SSLHandshakeException: ru.CryptoPro.ssl.pc_10.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_10.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_3.a(Unknown Source)
at ru.CryptoPro.ssl.SSLSocketImpl.a(Unknown Source)
at ru.CryptoPro.ssl.cl_66.a(Unknown Source)
at ru.CryptoPro.ssl.cl_66.a(Unknown Source)
at ru.CryptoPro.ssl.cl_18.a(Unknown Source)
at ru.CryptoPro.ssl.cl_18.a(Unknown Source)
at ru.CryptoPro.ssl.cl_66.u(Unknown Source)
at ru.CryptoPro.ssl.cl_66.a(Unknown Source)
at ru.CryptoPro.ssl.SSLSocketImpl.a(Unknown Source)
at ru.CryptoPro.ssl.SSLSocketImpl.o(Unknown Source)
at ru.CryptoPro.ssl.SSLSocketImpl.b(Unknown Source)
at ru.CryptoPro.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at java.base/sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:567)
at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:168)
at ru.pglukhov.security.Application.main(Application.java:60)
Caused by: ru.CryptoPro.ssl.pc_10.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_10.cl_2.a(Unknown Source)
at ru.CryptoPro.ssl.pc_10.cl_2.a(Unknown Source)
at ru.CryptoPro.ssl.pc_10.cl_4.b(Unknown Source)
at ru.CryptoPro.ssl.cl_122.a(Unknown Source)
at ru.CryptoPro.ssl.cl_122.a(Unknown Source)
at ru.CryptoPro.ssl.cl_122.checkServerTrusted(Unknown Source)
... 12 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at java.base/sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)
at java.base/sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)
at java.base/java.security.cert.CertPathBuilder.build(CertPathBuilder.java:297)
at ru.CryptoPro.reprov.CPCertPathBuilder.engineBuild(Unknown Source)
at java.base/java.security.cert.CertPathBuilder.build(CertPathBuilder.java:297)
... 18 more
Offline Евгений Афанасьев  
#6 Оставлено : 13 декабря 2023 г. 18:12:45(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Уже лучше. В cacerts, скорее всего, нет корневого сертификата сервера.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
billGilbert оставлено 13.12.2023(UTC)
Offline billGilbert  
#7 Оставлено : 13 декабря 2023 г. 20:04:36(UTC)
billGilbert

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

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

Сказал(а) «Спасибо»: 3 раз
Автор: Евгений Афанасьев Перейти к цитате
Уже лучше. В cacerts, скорее всего, нет корневого сертификата сервера.


Евгений, ваши советы привели меня к решению.

я добавлял сертификаты через утилитку KeyStoreExplorer и вроде видел их в свои cacert.

Но решил последовать Вашему совету и добавил заново сертификаты, которые ранее мне выслала поддержка Equifax, через консоль.

т.е. выполнил 2 команды

Цитата:
keytool -importcert -trustcacerts -file scoring_2023.cer -alias scoring_2023 -keystore cacerts
keytool -importcert -trustcacerts -file root.cer -alias scoring_root -keystore cacerts


После этого пример застрелял.

Последний вопрос. А те параметры которые я использую в System.setProperty являются актуальными и обязательными?

Я их собрал из ВСЕХ постов, где была речь о подключении по SSL/TLS, прошу сильно не ругать :(

Код:

public class Application {
    public static void main(String[] args) throws Exception {
        try {
            Security.addProvider(new JCSP()); // провайдер JCSP
            Security.addProvider(new JCP()); // провайдер JCP
            Security.addProvider(new RevCheck());
            Security.addProvider(new Provider());
        } catch (Exception e) {
            System.err.println("Exception in initializing crypto pro : "+ e);
        } catch (Error er) {
            System.err.println("Error in initializing crypto pro : "+ er);
        }

        try {

            System.setProperty("com.sun.security.enableCRLDP", "true");
            // Отладка
            System.setProperty("javax.net.debug", "all");
            System.setProperty("https.protocols", "TLSv1.2");
            System.setProperty("jdk.tls.client.protocols", "TLSv1.2");
            System.setProperty("https.default.protocol", "TLS");
            System.setProperty("https.socket.protocols", "TLSv1");
            //
            System.setProperty("tls_prohibit_disabled_validation", "false");

            SSLContext sslCtx = SSLContext.getInstance("GostTLS");
            InputStream cacerts = Application.class.getClassLoader().getResourceAsStream("cacerts");
            InputStream p12Cert = Application.class.getClassLoader().getResourceAsStream("p12.pfx");

            TrustManager[] trustManagers = getTrustManagers("jks", cacerts, "changeit");
            KeyManager[] keyManagers = getKeyManagers(JCSP.PFX_STORE_NAME, p12Cert, "password");

            sslCtx.init(keyManagers, trustManagers, null);
            SSLSocketFactory socketFactory = sslCtx.getSocketFactory();

            URL url = new URL("https://bki-b2b-test.scoring.ru/cr4.php");
            HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
            connection.setSSLSocketFactory(socketFactory);
            connection.connect();
            connection.disconnect();

            log.info("Connection was successfully");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    protected static KeyManager[] getKeyManagers(String keyStoreType, InputStream keyStoreFile, String keyStorePassword) throws Exception {
        KeyStore keyStore = KeyStore.getInstance(keyStoreType);
        keyStore.load(keyStoreFile, keyStorePassword.toCharArray());
        KeyManagerFactory kmf = KeyManagerFactory.getInstance("GostX509");
        kmf.init(keyStore, keyStorePassword.toCharArray());
        return kmf.getKeyManagers();
    }

    protected static TrustManager[] getTrustManagers(String trustStoreType, InputStream trustStoreFile, String trustStorePassword) throws Exception {
        KeyStore trustStore = KeyStore.getInstance(trustStoreType);
        trustStore.load(trustStoreFile, trustStorePassword.toCharArray());
        TrustManagerFactory tmf = TrustManagerFactory.getInstance("GostX509");
        tmf.init(trustStore);
        return tmf.getTrustManagers();
    }
}
Offline Евгений Афанасьев  
#8 Оставлено : 13 декабря 2023 г. 23:41:58(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Попробуйте оставить так:
Цитата:

System.setProperty("com.sun.security.enableCRLDP", "true");
// Отладка
System.setProperty("javax.net.debug", "all");
System.setProperty("https.protocols", "TLSv1.2");
System.setProperty("jdk.tls.client.protocols", "TLSv1.2");
System.setProperty("https.default.protocol", "TLS");
System.setProperty("https.socket.protocols", "TLSv1");
//
System.setProperty("tls_prohibit_disabled_validation", "false");

SSLContext sslCtx = SSLContext.getInstance("GostTLS");

=>
Цитата:

System.setProperty("com.sun.security.enableCRLDP", "true"); // грузить CRL для проверки сертификата сервера из сети
// Отладка
System.setProperty("javax.net.debug", "all");
//
System.setProperty("tls_prohibit_disabled_validation", "false");

SSLContext sslCtx = SSLContext.getInstance("GostTLSv1.2"); // для поддержки TLS 1.2, 1.1, 1.0

Отладка javax.net.debug по желанию.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
billGilbert оставлено 14.12.2023(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.