Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ 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,910
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Здравствуйте.
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,910
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Если вы подключаетесь к 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,910
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
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 Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.