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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline distep2  
#1 Оставлено : 30 октября 2024 г. 14:48:27(UTC)
distep2

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

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

Сказал(а) «Спасибо»: 1 раз
Добрый день! Пытаюсь отправлять запросы в ГИИС ДМДК https://exchange.dmdk.ru/ws/v3. Там двусторонний TLS. Из stunnel все работает отлично, но из Java получаю handshake_failure.

помогите разобраться в логах, где проблема?

тут весь лог:



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

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

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

Сказал(а) «Спасибо»: 100 раз
Поблагодарили: 272 раз в 253 постах
Добрый день!

посмотрите эту ветку https://www.cryptopro.ru...osts&t=14519&p=2
Техническую поддержку оказываем тут
Наша база знаний
Offline distep2  
#3 Оставлено : 31 октября 2024 г. 9:02:01(UTC)
distep2

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

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

Сказал(а) «Спасибо»: 1 раз
Добрый день. Да, я попробовал то, что вы предлагали. Это решило проблему с появлением ключей, но ошибка осталась. Поэтому я решил перенести этот вопрос в новую ветку, поскольку изначально там вопрос был про the trustAnchors parameter must be non-empty

После настройки KeyManagers все равно ошибка остается. Также я не стал собирать новый KeyStore, а использовал дефолтный в котором уже лежат все сертификаты. Ниже код:

Код:


@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class HttpsConnectionTest extends AbstractFunctionalTest {

    final String keystoreName = JCP.HD_STORE_NAME;

    final String certAlias = "myAlias";

    private KeyStore keyStore;
    private KeyStore trustedKeyStore;
    private X509Certificate certificate;
    private Collection<X509Certificate> certs;

    @BeforeAll
    public void beforeAll() throws Exception {
//        JCPInit.initProviders(false);

        Security.addProvider(new JCSP());
        Security.addProvider(new JCP());
        Security.addProvider(new CryptoProvider());
        Security.addProvider(new RevCheck());
        Security.addProvider(new Provider());

        System.setProperty("com.sun.security.enableCRLDP", "true");
        System.setProperty("com.ibm.security.enableCRLDP", "true");
        System.setProperty("disable_default_context", "true");

        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");

        initKeyStore();
        certs = getCertsFromCaCerts();

        for (String rootCertPath : rootCertPaths) {
            Collection<? extends Certificate> certificates = loadCertificates(rootCertPath);
            for (Certificate c : certificates){
                X509Certificate c0 = (X509Certificate) c;
                certs.add(c0);
            }
        }

        System.out.println(HDImageStore.getDir());
    }

    private void initKeyStore()
        throws CertificateException, IOException, NoSuchAlgorithmException, KeyStoreException, NoSuchProviderException {
        keyStore = KeyStore.getInstance(keystoreName, "JCP");
        keyStore.load(new StoreInputStream(certAlias), null);

        certificate = (X509Certificate) keyStore.getCertificate(certAlias);
    }

    public Set<X509Certificate> getCertsFromCaCerts() throws Exception{
        Set<X509Certificate> result = new HashSet<>();
        KeyStore caCerts = KeyStore.getInstance("JKS");
        String caCertsPath = System.getProperty("java.home") + "/lib/security/cacerts".replace("/", File.separator);
        caCerts.load(Files.newInputStream(Paths.get(caCertsPath)), "changeit".toCharArray());
        Enumeration<String> aliases = caCerts.aliases();
        while (aliases.hasMoreElements()) {
            String alias = aliases.nextElement();
            result.add((X509Certificate) caCerts.getCertificate(alias));
        }
        return result;
    }

    @Test
    public void check() throws Exception {
        String urlPath = "https://exchange.dmdk.ru/ws/v3";
        URL url = new URL(urlPath);

        KeyManager[] keyManagers = getKeyManagers(keymanagerPassword.toCharArray());
        TrustManager[] trustManagers = getGostTrustManager();

        SSLContext sslContext = SSLContext.getInstance(Provider.ALGORITHM_12, "JTLS");
        sslContext.init(keyManagers, trustManagers, null);

        SSLSocketFactory socketFactory = sslContext.getSocketFactory();

        HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
        connection.setSSLSocketFactory(socketFactory);

        connection.connect();
        print_content(connection, null);

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

    public static void print_content(HttpsURLConnection
        connection, String encoding) throws Exception {

        if (encoding == null) {
            encoding = "windows-1251";
        } // if

        if (connection != null) {

            System.out.println("------ CONTENT BEGIN ------");

            BufferedReader br = new BufferedReader(new InputStreamReader(
                connection.getInputStream(), encoding));

            String input;

            while ((input = br.readLine()) != null) {
                System.out.println(input);
            } // while

            br.close();
            System.out.println("------ CONTENT END ------");

        } // if

    }

    public KeyManager[] getKeyManagers(char[] password)
        throws Exception {
        KeyManagerFactory factory = KeyManagerFactory.getInstance("GostX509", "JTLS");
//            log.warn("Need certificate chain for your alias. using local certificates");
            KeyStore trustStore = KeyStore.getInstance(JCP.CERT_STORE_NAME);
            trustStore.load(null,null);
            if (certs.isEmpty())
                throw new RuntimeException("trust certificates not provided");
            for (X509Certificate certificate : certs)
                trustStore.setCertificateEntry(UUID.randomUUID().toString(), certificate);
            PKIXBuilderParameters parameters = new PKIXBuilderParameters(trustStore, new X509CertSelector());
            parameters.setRevocationEnabled(true);
            parameters.setCertStores(Collections.singletonList(CertStore.getInstance("Collection", new CollectionCertStoreParameters(certs))));
            JavaTLSCertPathManagerParameters
                managerParameters = new JavaTLSCertPathManagerParameters(keyStore, password);
            managerParameters.setParameters(parameters);
            factory.init(managerParameters);
            return factory.getKeyManagers();
    }

    public TrustManager[] getGostTrustManager() throws Exception{
        KeyStore keyStore = KeyStore.getInstance(JCP.CERT_STORE_NAME);
        keyStore.load( null, null);
        for (X509Certificate cert : certs) {
            keyStore.setCertificateEntry(UUID.randomUUID().toString(), cert);
        }

        TrustManagerFactory factory = TrustManagerFactory.getInstance("GostX509", "JTLS");
        factory.init(keyStore);
        return factory.getTrustManagers();
    }

  

}



тут полный лог log.txt (196kb) загружен 1 раз(а).

Отредактировано пользователем 31 октября 2024 г. 9:11:29(UTC)  | Причина: приложил полный лог

Offline Санчир Момолдаев  
#4 Оставлено : 31 октября 2024 г. 9:08:04(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 100 раз
Поблагодарили: 272 раз в 253 постах
у вас там
Цитата:
no alias is match

клиентский сертификат не подошел.

1) посмотрите что ваш клиентский сертификат издан УЦ который есть в списке
Цитата:
Cert Authorities:
<CN=Минкомсвязь России, OID.1.2.643.3.131.1.1=#120c303037373130343734333735, OID.1.2.643.100.1=#120d31303437373032303236373031, O=Минкомсвязь России, STREET="улица Тверская, дом 7", L=г. Москва, ST=77 Москва, C=RU, EMAILADDRESS=dit@minsvyaz.ru>
<CN=ЗАО «Национальный удостоверяющий центр», O=ЗАО «Национальный удостоверяющий центр», STREET="ул. Авиамоторная, д. 8А, стр. 5", L=Москва, ST=77 г. Москва, C=RU, OID.1.2.643.3.131.1.1=#120c303037373232373636353938, OID.1.2.643.100.1=#120d31313237373436303336343934>
<OID.1.2.643.100.1=#120d31313035323630303031313735, OID.1.2.643.3.131.1.1=#120c303035323630323730363936, STREET="ул. Радио, дом 24, корпус 1, помещение V, комната 23", EMAILADDRESS=ca@iecp.ru, L=г. Москва, ST=77 г. Москва, C=RU, OU=Удостоверяющий центр, O="Акционерное общество \"Аналитический Центр\"", CN="АО \"Аналитический Центр\"">
<CN=ПАО Сбербанк, O=ПАО Сбербанк, OU=Удостоверяющий центр, STREET="ул. Вавилова, д. 19", L=г. Москва, ST=77 Москва, C=RU, OID.1.2.643.100.1=#120d31303237373030313332313935, EMAILADDRESS=casbrf@sberbank.ru, OID.1.2.643.100.4=#120a37373037303833383933>
<CN=TLS-CA, C=RU>
<CN=Центр сертификации, OID.1.2.643.3.131.1.1=#120c303037383133323532313539, OID.1.2.643.100.1=#120d31313637383437323235323831>
<CN=Минцифры России, OID.1.2.643.100.4=#120a37373130343734333735, OID.1.2.643.100.1=#120d31303437373032303236373031, O=Минцифры России, STREET="Пресненская набережная, дом 10, строение 2", L=г. Москва, ST=77 Москва, C=RU, EMAILADDRESS=dit@digital.gov.ru>
<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>
<CN=CryptoPro GOST Root CA, O="LLC \"Crypto-Pro\"", L=Moscow, ST=Moscow, C=RU, OID.1.2.643.3.131.1.1=#120c303037373137313037393931, OID.1.2.643.100.1=#120d31303337373030303835343434>
<CN="Акционерное общество \"Гринатом\"", O="Акционерное общество \"Гринатом\"", OU=Отдел криптографической защиты, STREET=ул. Большая Ордынка д. 24, L=г. Москва, ST=77 Москва, C=RU, OID.1.2.643.100.1=#120d31303937373436383139373230, EMAILADDRESS=ca@rosatom.ru, OID.1.2.643.100.4=#120a37373036373239373336>
<OID.1.2.643.100.4=#120a37373032323335313333, OID.1.2.643.100.1=#120d31303337373030303133303230, CN=Центральный банк Российской Федерации, O=Банк России, STREET="ул. Неглинная, д. 12", L=г. Москва, ST=77 г. Москва, C=RU>
<CN="ООО \"Сертум-Про\"", O="ООО \"Сертум-Про\"", STREET="ул. Малопрудная, стр. 5, офис 715", L=Екатеринбург, ST=66 Свердловская область, C=RU, OID.1.2.643.100.4=#120a36363733323430333238, OID.1.2.643.100.1=#120d31313136363733303038353339, EMAILADDRESS=ca@sertum.ru>
<CN=Федеральная налоговая служба, O=Федеральная налоговая служба, STREET="ул. Неглинная, д. 23", L=г. Москва, ST=77 Москва, C=RU, OID.1.2.643.100.1=#120d31303437373037303330353133, EMAILADDRESS=uc@tax.gov.ru, OID.1.2.643.100.4=#120a37373037333239313532>


2) цепочка этого сертификата должна быть или в контейнере (alias) или передана извне с помощью JavaTLSCertPathManagerParameters
Техническую поддержку оказываем тут
Наша база знаний
Offline Санчир Момолдаев  
#5 Оставлено : 31 октября 2024 г. 9:19:13(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 100 раз
Поблагодарили: 272 раз в 253 постах
Цитата:
Oct 30, 2024 6:02:53 PM ru.CryptoPro.ssl.cl_120 a
FINE: adding as trusted cert:
Subject: CN=Фамилия Имя Отчество, SURNAME=Фамилия, GIVENNAME=Имя Отчество, OID.1.2.643.100.3=#120b3133333035393032343232, OID.1.2.643.3.131.1.1=#120c363630323035393535303036, EMAILADDRESS=distep2@my-company.ru
Issuer: CN="АО \"ПФ \"СКБ Контур\"", O="АО \"ПФ \"СКБ Контур\"", OU=Удостоверяющий центр, STREET="улица Народной воли, строение 19А", L=Екатеринбург, ST=66 Свердловская область, C=RU, OID.1.2.643.100.1=#120d31303236363035363036363230, EMAILADDRESS=ca@skbkontur.ru, OID.1.2.643.100.4=#120a36363633303033313237
Algorithm: GOST3410_2012_256
Serial number: 0x53fcb8200e2b1eda949253116b5c1c7ed
Valid from Thu Sep 05 07:51:13 UTC 2024
until Fri Sep 05 07:56:13 UTC 2025

этот листовой сертификат не должен быть в хранилище.
должна быть цепочка.

в контейнере цепочки нет.
Цитата:
FINE: Built certificate chain size: 1


т.е. либо устанавливаете цепочку (промежуточный и корневой) в контейнер,
либо подгружаете цепочку руками.

в последнем случае
итого должно быть 3 keystore
1) keystore с закрытым ключом
2) keystore с цепочкой для удаленного веб-сервера, который уйдет в TrustManager
3) keystore с цепочкой для вашего ключа, который уйдет в KeyManager
Техническую поддержку оказываем тут
Наша база знаний
Offline distep2  
#6 Оставлено : 31 октября 2024 г. 10:08:31(UTC)
distep2

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

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

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