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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline imgen  
#1 Оставлено : 13 мая 2021 г. 16:37:39(UTC)
imgen

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

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

Добрый день, понимаю, что вопрос очень простой, но не могу с ходу понять, что делаю не так.

У организации есть необходимость логиниться по токену в сервисах.

Соответственно есть файл сертификата и 6 key файлов.
Есть корневой сертификат минкомсвязи. Добавлять сертификаты нужно по ТЗ именно программно.

Не могу понять, как это все добро програмно добавить в хранилище и послать ssl запрос.
Делаю так:

Код:

package com.company;

import ru.CryptoPro.JCP.JCP;
import ru.CryptoPro.JCP.KeyStore.HDImage.HDImageStore;
import ru.CryptoPro.ssl.Provider;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.KeyStore;
import java.security.Security;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.util.logging.Logger;

public class Main {

    private static final String URL =
            "https://stenddss.cryptopro.ru:4430/opensmeidp/ums/";


    public static void main(String[] args) throws Exception {
        System.setProperty("com.sun.security.enableCRLDP", "true");
        System.setProperty("com.ibm.security.enableCRLDP", "true");
        System.setProperty("com.sun.security.enableAIAcaIssuers", "true");
        System.setProperty("ru.CryptoPro.reprov.enableAIAcaIssuers", "true");
        System.setProperty("javax.net.ssl.keyStoreProvider", "JCP");
        System.setProperty("javax.net.ssl.keyStoreType", "HDImageStore");
        //System.setProperty("javax.net.ssl.trustStore", "/etc/ssl/certs/java/cacerts");
        //System.setProperty("javax.net.ssl.trustStoreType", "CertStore");
        //System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
        /*Security.setProperty("ssl.SocketFactory.provider", "ru.CryptoPro.ssl.SSLSocketFactoryImpl");
        Security.setProperty("ssl.ServerSocketFactory.provider", "ru.CryptoPro.ssl.SSLServerSocketFactoryImpl");
        //System.setProperty("javax.net.debug", "ssl,handshake,data,trustmanager");

        System.setProperty("javax.net.ssl.keyStoreType", "HDImageStore");
        //System.setProperty("javax.net.ssl.keyStore",
        //        "client_exch");
        ////System.setProperty("javax.net.ssl.keyStorePassword", "password");

        System.setProperty("javax.net.ssl.trustStoreType", "HDImageStore");
*/

        final String keystoreName = "HDImageStore";
        final String keystorePass = "password";
        final String keystorePath = "/path/to/keysDir";
        final String certPath = "/path/to/our.cer";
        final String rootCertPath = "/path/to/root/4BC6DC14D97010C41A26E058AD851F81C842415A.cer";
        final String alias = "Cert";


//Запись сертификата в хранилище
        KeyStore ks=addCert(certPath, JCP.HD_STORE_NAME, keystorePass, keystorePath, alias);
        //KeyStore ts=addCert(rootCertPath, JCP.HD_STORE_NAME, "null", "null", "root");

        Certificate rootCert=loadCertificate(new File(rootCertPath));
        KeyStore rootks = KeyStore.getInstance("HDImageStore");
        rootks.load(null,"root".toCharArray());
        rootks.setCertificateEntry("root",rootCert);

        sendTest(ks,keystorePass,rootks);

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


        //delCert(keystoreName, keystorePass, keystorePath, alias);
    }

    private static Certificate loadCertificate(File certificateFile) throws Exception{
        try (FileInputStream inputStream = new FileInputStream(certificateFile)) {
            return (Certificate) CertificateFactory.getInstance("X509").generateCertificate(inputStream);
        }
    }

    public static void sendTest(KeyStore keyStore, String keystorePass, KeyStore trustStore) throws Exception {
        // Загрузка хранилища доверенных корневых
        // сертификатов.

        char[] KEY_STORE_PASSWORD = null;
        if (!"null".equalsIgnoreCase(keystorePass)) {
            KEY_STORE_PASSWORD = keystorePass.toCharArray();
        }

        //KeyStore trustStore = KeyStore.getInstance("Corp CA");
        //trustStore.load(null,"changeit".toCharArray());

        KeyManagerFactory kmFactory = KeyManagerFactory.getInstance(Provider.KEYMANGER_ALG);
        kmFactory.init(keyStore, KEY_STORE_PASSWORD);

        TrustManagerFactory tmFactory = TrustManagerFactory.getInstance(Provider.TRUSTMANGER_ALG);
        tmFactory.init(trustStore);
        Certificate root=trustStore.getCertificate("root");
        // Инициализация SSL контекста.

        SSLContext sslContext = SSLContext.getInstance(Provider.ALGORITHM);
        sslContext.init(kmFactory.getKeyManagers(), tmFactory.getTrustManagers(), null);

        // Создание подключения.

        java.net.URL url = new URL(URL);
        System.out.println(url);

        HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
        connection.setSSLSocketFactory(sslContext.getSocketFactory());

        connection.setRequestMethod("POST");
        connection.setDoOutput(true);

        connection.setRequestProperty("Content-Type", "application/json");
        try (DataOutputStream wr = new DataOutputStream(connection.getOutputStream())) {
            wr.write("{\"Login\":\"RestTestUser\",\"Email\":\"test@cp.ru\",\"PhoneNumber\":\"+79150510528\"}".getBytes());
        }

        connection.connect();

        // Получение и вывод ответа.

        int responseCode = connection.getResponseCode();
        BufferedReader bufferedReader = null;

        try {

            if (responseCode != HttpURLConnection.HTTP_OK) {
                throw new IOException("Invalid http response: " + responseCode);
            }

            InputStreamReader inputStreamReader = new InputStreamReader(
                    connection.getInputStream(), "UTF-8");

            bufferedReader = new BufferedReader(inputStreamReader);
            String input;

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

        } finally {

            if (bufferedReader != null) {
                bufferedReader.close();
            }

            connection.disconnect();

        }
    }

    public static KeyStore addCert(String certPath, String keystoreName,
                                   String keystorePass,
                                   String keystorePath, String alias) throws Exception {
        final CertificateFactory cf = CertificateFactory.getInstance("X509");

        final Certificate rootCert = cf.generateCertificate(
                new BufferedInputStream(new FileInputStream(certPath)));


        /*final KeyStore ks = KeyStore.getInstance(keystoreName);
        char[] KeyStorePass = null;
        if (!"null".equalsIgnoreCase(keystorePass)) {
            KeyStorePass = keystorePass.toCharArray();
        }
        InputStream is = null;
        if (!"null".equalsIgnoreCase(keystorePath)) {
            is = new FileInputStream(keystorePath);
        }
        ks.load(is, KeyStorePass);

        ks.setCertificateEntry(alias, rootCert);

        OutputStream os = null;
        if (!"null".equalsIgnoreCase(keystorePath)) {
            os = new FileOutputStream(keystorePath);
        }
        ks.store(os, KeyStorePass);*/
        HDImageStore.setDir(keystorePath);
        KeyStore ks = KeyStore.getInstance("HDImageStore");

        char[] KeyStorePass = null;
        if (!"null".equalsIgnoreCase(keystorePass)) {
            KeyStorePass = keystorePass.toCharArray();
        }

        ks.load(null,KeyStorePass);
        ks.setCertificateEntry(alias, rootCert);

        Logger.getLogger("LOGGER").info(
                "Recording of a Certificate named \"" + alias + "\" to " +
                        keystoreName + " is completed.");
        return ks;
    }
    /**
     * Удаление сертификата из хранилища
     *
     * @param keystoreName тип хранилища
     * @param keystorePass пароль на хранилище
     * @param keystorePath путь к хранилищу
     * @param alias имя
     * @throws Exception е
     */
    public static void delCert(String keystoreName,
                               String keystorePass,
                               String keystorePath, String alias) throws Exception {

        final KeyStore ks = KeyStore.getInstance(keystoreName);
        char[] KeyStorePass = null;
        if (!"null".equalsIgnoreCase(keystorePass)) {
            KeyStorePass = keystorePass.toCharArray();
        }
        InputStream is = null;
        if (!"null".equalsIgnoreCase(keystorePath)) {
            is = new FileInputStream(keystorePath);
        }
        ks.load(is, KeyStorePass);

        if (ks.isCertificateEntry(alias)) ks.deleteEntry(alias);

        OutputStream os = null;
        if (!"null".equalsIgnoreCase(keystorePath)) {
            os = new FileOutputStream(keystorePath);
        }
        ks.store(os, KeyStorePass);
        Logger.getLogger("LOGGER").info(
                "Deleting of a Certificate named \"" + alias + "\" to " +
                        keystoreName + " is completed.");

    }
}



Сейчас выходит ошибка:
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

Экспортные ограничения сняты в openjdk-8

Хотелось бы понять почему. Заранее спасибо за помощь.

Отредактировано пользователем 13 мая 2021 г. 19:20:58(UTC)  | Причина: добавил про ограничения

Offline Евгений Афанасьев  
#2 Оставлено : 13 мая 2021 г. 20:20:31(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 688 раз в 649 постах
Здравствуйте.
1. Вероятно, это ошибка при построении цепочки сертификатов сервера. Если в rootks, который попадает в TrustManagerFactory,
А) действительно помещается корневой сертификат Минкомсвязи и
Б) именно он нужен для цепочки сервера (то есть этот не тестовый сервер с цепочкой, оканчивающейся иным сертификатом),
то попробуйте вместо
Цитата:

KeyStore rootks = KeyStore.getInstance("HDImageStore");

задать
Цитата:

KeyStore rootks = KeyStore.getInstance("CertStore");

2. Вы в коде sendTest уже создаете SSLContext sslContext и передаете его в connection:
Цитата:

connection.setSSLSocketFactory(sslContext.getSocketFactory());

поэтому свойства вроде
Цитата:

System.setProperty("javax.net.ssl.keyStoreProvider", "JCP");
System.setProperty("javax.net.ssl.keyStoreType", "HDImageStore");

излишни и не нужны.
3. Если пп.1-2 не помогут, то соберите и приложите полный лог, включив логирование так: https://support.cryptopr...lirovnija-kriptopro-jtls где
Цитата:

java.util.logging.ConsoleHandler.level=ALL
ru.CryptoPro.ssl.SSLLogger.level=ALL

Offline imgen  
#3 Оставлено : 13 мая 2021 г. 21:00:25(UTC)
imgen

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

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

Спасибо за помощь, однако все равно что-то не выходит коннект. Код следующий:
Код:

package com.company;

import org.apache.commons.codec.cli.Digest;
import org.apache.commons.codec.digest.DigestUtils;
import ru.CryptoPro.JCP.JCP;
import ru.CryptoPro.JCP.KeyStore.HDImage.HDImageStore;
import ru.CryptoPro.ssl.Provider;

import javax.crypto.SecretKey;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
import javax.xml.bind.DatatypeConverter;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.KeyStore;
import java.security.MessageDigest;
import java.security.Security;
import java.security.cert.Certificate;
import java.security.cert.CertificateEncodingException;
import java.security.cert.CertificateFactory;
import java.util.logging.Logger;

public class Main {

    private static final String URL =
            "https://stenddss.cryptopro.ru:4430/opensmeidp/ums/"
            ;

    public static String getCertThumbprint(Certificate cert) throws CertificateEncodingException {
        return  DatatypeConverter.printHexBinary(DigestUtils.getSha1Digest().digest(cert.getEncoded()));
    }

    public static void main(String[] args) throws Exception {
        System.setProperty("com.sun.security.enableCRLDP", "true");
        System.setProperty("com.ibm.security.enableCRLDP", "true");
        System.setProperty("com.sun.security.enableAIAcaIssuers", "true");
        System.setProperty("ru.CryptoPro.reprov.enableAIAcaIssuers", "true");

        final String keystoreName = "HDImageStore";
        final String keystorePass = "1234567890";
        final String keystorePath = "/path/to/cert/main.000/";
        final String certPath = "/path/to/cert/main.cer";
        final String rootCertPath = "/path/to/rootcert/4BC6DC14D97010C41A26E058AD851F81C842415A.cer";
        final String alias = "Cert";


        //Запись сертификата в хранилище
        KeyStore ks=addCert(certPath, JCP.HD_STORE_NAME, keystorePass, keystorePath, alias);
        //KeyStore ts=addCert(rootCertPath, JCP.HD_STORE_NAME, "null", "null", "root");

        Certificate rootCert=loadCertificate(new File(rootCertPath));
        String thumbPrint=getCertThumbprint(loadCertificate(new File(certPath)));

        System.out.println(thumbPrint);
        KeyStore rootks = KeyStore.getInstance("CertStore");
        rootks.load(null,"root".toCharArray());
        rootks.setCertificateEntry("root",rootCert);

        sendTest(URL+thumbPrint,ks,keystorePass,rootks);

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


    public static void sendTest(String urlS,KeyStore keyStore, String keystorePass, KeyStore trustStore) throws Exception {
        KeyManagerFactory kmFactory = KeyManagerFactory.getInstance(Provider.KEYMANGER_ALG);
        kmFactory.init(keyStore, keystorePass.toCharArray());

        TrustManagerFactory tmFactory = TrustManagerFactory.getInstance(Provider.TRUSTMANGER_ALG);
        tmFactory.init(trustStore);
        // Инициализация SSL контекста.

        SSLContext sslContext = SSLContext.getInstance(Provider.ALGORITHM);
        sslContext.init(kmFactory.getKeyManagers(), tmFactory.getTrustManagers(), null);

        // Создание подключения.

        java.net.URL url = new URL(urlS);
        System.out.println(url);

        HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
        connection.setSSLSocketFactory(sslContext.getSocketFactory());

        connection.setRequestMethod("POST");
        connection.setDoOutput(true);

        connection.setRequestProperty("Content-Type", "application/json");
        try (DataOutputStream wr = new DataOutputStream(connection.getOutputStream())) {
            wr.write("{\"Login\":\"RestTestUser\",\"Email\":\"test@cp.ru\",\"PhoneNumber\":\"+79150510528\"}".getBytes());
        }

        connection.connect();

        // Получение и вывод ответа.

        int responseCode = connection.getResponseCode();
        BufferedReader bufferedReader = null;

        try {

            if (responseCode != HttpURLConnection.HTTP_OK) {
                throw new IOException("Invalid http response: " + responseCode);
            }

            InputStreamReader inputStreamReader = new InputStreamReader(
                    connection.getInputStream(), "UTF-8");

            bufferedReader = new BufferedReader(inputStreamReader);
            String input;

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

        } finally {

            if (bufferedReader != null) {
                bufferedReader.close();
            }

            connection.disconnect();

        }
    }

    private static Certificate loadCertificate(File certificateFile) throws Exception{
        try (FileInputStream inputStream = new FileInputStream(certificateFile)) {
            return (Certificate) CertificateFactory.getInstance("X509").generateCertificate(inputStream);
        }
    }

    public static KeyStore addCert(String certPath, String keystoreName,
                                   String keystorePass,
                                   String keystorePath, String alias) throws Exception {
        final CertificateFactory cf = CertificateFactory.getInstance("X509");
        HDImageStore.setDir(keystorePath);
        final Certificate rootCert = cf.generateCertificate(
                new BufferedInputStream(new FileInputStream(certPath)));

        KeyStore ks = KeyStore.getInstance("HDImageStore");

        char[] KeyStorePass = null;
        if (!"null".equalsIgnoreCase(keystorePass)) {
            KeyStorePass = keystorePass.toCharArray();
        }

        ks.load(null,KeyStorePass);

        /*SecretKey secretKey = getSecretKey();
        KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(secretKey);
        KeyStore.ProtectionParameter protectionParameter=new  KeyStore.ProtectionParameter();

        ks.setEntry("keyAlias2", secretKeyEntry, new KeyStore.PasswordProtection(KeyStorePass));*/

        ks.setCertificateEntry(alias, rootCert);

        Logger.getLogger("LOGGER").info(
                "Recording of a Certificate named \"" + alias + "\" to " +
                        keystoreName + " is completed.");
        return ks;
    }
}



Лог следующий:

Offline Евгений Афанасьев  
#4 Оставлено : 13 мая 2021 г. 21:39:01(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 688 раз в 649 постах
Если вы подключаетесь к https://eaisto.gibdd.ru/...EECA090D9EB81ADB9621E331 то там ведь не ГОСТ TLS - сертификат сервера имеет открытый ключ на алгоритме RSA (если открыть в браузере). JTLS поддерживает только ГОСТ и шлет соответствующие алгоритмы.
И срок сертификата сервера истек (хотя это не имеет значения).

Отредактировано пользователем 13 мая 2021 г. 21:39:51(UTC)  | Причина: Не указана

Offline imgen  
#5 Оставлено : 14 мая 2021 г. 15:59:36(UTC)
imgen

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

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

Тогда не совсем понятно, как работать и с JTLS и с RSA.

Пытаюсь уже не добавляя что-то простучаться на сайт с заведомо рабочим сертификатом:

Код:

    public static void main(String[] args) throws Exception {

        HttpClient httpClient = HttpClientBuilder.create().setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
                .build();
        try
        {

            //Define a postRequest request
            HttpPost postRequest = new HttpPost("https://ya.ru");

            //Set the API media type in http content-type header
            postRequest.addHeader("content-type", "application/xml");

            //Set the request post body
            StringEntity userEntity = new StringEntity("test");
            postRequest.setEntity(userEntity);

            //Send the request; It will immediately return the response in HttpResponse object if any
            HttpResponse response = httpClient.execute(postRequest);

            //verify the valid error code first
            int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode != 201)
            {
                throw new RuntimeException("Failed with HTTP error code : " + statusCode);
            }
        }
        finally
        {
            //Important: Close the connect
            httpClient.getConnectionManager().shutdown();
        }

    }


выдает ошибку:
Цитата:
May 14, 2021 3:53:43 PM ru.CryptoPro.JCSP.MSCAPI.cl_6 enumInstalledProviders
INFO: Provider with type 24 not found.
May 14, 2021 3:53:43 PM ru.CryptoPro.ssl.TrustManagerFactoryImpl a
INFO: trustStore is : No File Available, using empty keystore.
May 14, 2021 3:53:43 PM ru.CryptoPro.ssl.TrustManagerFactoryImpl a
INFO: trustStore is : No File Available, using empty keystore.
May 14, 2021 3:53:43 PM ru.CryptoPro.ssl.TrustManagerFactoryImpl a
INFO: trustStore type is : CertStore
May 14, 2021 3:53:43 PM ru.CryptoPro.ssl.TrustManagerFactoryImpl a
INFO: trustStore type is : CertStore
May 14, 2021 3:53:43 PM ru.CryptoPro.ssl.TrustManagerFactoryImpl a
INFO: trustStore provider is :
May 14, 2021 3:53:43 PM ru.CryptoPro.ssl.TrustManagerFactoryImpl a
INFO: trustStore provider is :
May 14, 2021 3:53:43 PM ru.CryptoPro.ssl.TrustManagerFactoryImpl a
INFO: init truststore
May 14, 2021 3:53:43 PM ru.CryptoPro.ssl.TrustManagerFactoryImpl a
INFO: init truststore
May 14, 2021 3:53:43 PM ru.CryptoPro.ssl.cl_121 a
FINE:
%% adding as trusted certificates %%

May 14, 2021 3:53:43 PM ru.CryptoPro.ssl.cl_121 a
FINE:
%% adding as trusted certificates %%

May 14, 2021 3:53:44 PM ru.CryptoPro.JCSP.MSCAPI.cl_6 enumInstalledProviders
INFO: Provider with type 24 not found.
Exception in thread "main" javax.net.ssl.SSLException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
at sun.security.ssl.Alert.createSSLException(Alert.java:133)
at sun.security.ssl.TransportContext.fatal(TransportContext.java:324)
at sun.security.ssl.TransportContext.fatal(TransportContext.java:267)
at sun.security.ssl.TransportContext.fatal(TransportContext.java:262)
at sun.security.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1554)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:441)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:436)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:384)
at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
at com.company.Main.main(Main.java:101)
Caused by: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
at ru.CryptoPro.ssl.pc_4.cl_2.<init>(Unknown Source)
at ru.CryptoPro.ssl.pc_4.cl_4.a(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.a(Unknown Source)
at ru.CryptoPro.ssl.cl_121.checkServerTrusted(Unknown Source)
at sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:638)
at sun.security.ssl.CertificateMessage$T12CertificateConsumer.onCertificate(CertificateMessage.java:473)
at sun.security.ssl.CertificateMessage$T12CertificateConsumer.consume(CertificateMessage.java:369)
at sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:377)
at sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:444)
at sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:422)
at sun.security.ssl.TransportContext.dispatch(TransportContext.java:182)
at sun.security.ssl.SSLTransport.decode(SSLTransport.java:152)
at sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1383)
at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1291)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:435)
... 14 more
Caused by: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
at java.security.cert.PKIXParameters.setTrustAnchors(PKIXParameters.java:200)
at java.security.cert.PKIXParameters.<init>(PKIXParameters.java:120)
at java.security.cert.PKIXBuilderParameters.<init>(PKIXBuilderParameters.java:104)
... 31 more


Правильно ли я понимаю, что при установке JTLS я лишаюсь возможности делать запросы https c ключем RSA?
Offline Евгений Афанасьев  
#6 Оставлено : 14 мая 2021 г. 17:45:25(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 688 раз в 649 постах
1. Если вы используете JCP 2.0 для java 7-8, то после установки cpSSL.jar в JRE/lib/security/java.security будут свойства:
Цитата:

ssl.KeyManagerFactory.algorithm=GostX509
ssl.TrustManagerFactory.algorithm=GostX509
ssl.SocketFactory.provider=ru.CryptoPro.ssl.SSLSocketFactoryImpl
ssl.ServerSocketFactory.provider=ru.CryptoPro.ssl.SSLServerSocketFactoryImpl

Нужно первые 2 вернуть к исходному виду:
Цитата:

ssl.KeyManagerFactory.algorithm=SunX509
ssl.TrustManagerFactory.algorithm=PKIX

А вторые два - закомментировать (#).
2. Если вы используете JCP 2.0-A для java 10+ и задали указанные выше свойства программно, то нужно после строки Security.addProvider(new Provider()) в вашем коде, если вы добавляете провайдеры программно, добавить:
Цитата:

Security.setProperty("ssl.KeyManagerFactory.algorithm", "SunX509");
Security.setProperty("ssl.TrustManagerFactory.algorithm", "PKIX");
Security.setProperty("ssl.SocketFactory.provider", "");
Security.setProperty("ssl.ServerSocketFactory.provider", "");

Если используете JCP 2.0-A для java 10+ и задали указанные свойства в JRE/lib/security/java.security, то см. п.1.

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

thanks 2 пользователей поблагодарили Евгений Афанасьев за этот пост.
Санчир Момолдаев оставлено 14.05.2021(UTC), Seir0n оставлено 09.06.2022(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.