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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline stanbel1  
#1 Оставлено : 12 июля 2018 г. 17:54:15(UTC)
stanbel1

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

Группы: Участники
Зарегистрирован: 15.12.2017(UTC)
Сообщений: 14
Откуда: Москва

Сказал(а) «Спасибо»: 1 раз
пытаюсь установить соеденение с двухсторонним SSL

Код:

	public static void main(String[] args) throws  Exception {
	
        System.setProperty("https.proxyHost", "172.18.0.88");
        System.setProperty("https.proxyPort", "3128");
        System.setProperty("http.proxyHost", "172.18.0.88");
        System.setProperty("http.proxyPort", "3128");
        System.setProperty("com.sun.security.enableCRLDP", "true"); // для sun jvm
        System.setProperty("javax.net.ssl.supportGVO", "true");
        
        KeyStore ks = KeyStore.getInstance("HDImageStore", "JCP"); // Тут хранится только один наш сертификат            
        ks.load(new FileInputStream("C:\\Dev Tools\\Eclipse workspace\\NBKI-CKKI\\bogocert"), "123".toCharArray());
    

        KeyStore kst = KeyStore.getInstance("HDImageStore", "JCP");   // Тут хранится сертификат удалённого сервера и корневые сертификаты
        kst.load(new FileInputStream("C:\\Dev Tools\\Eclipse workspace\\NBKI-CKKI\\trust17"), "123".toCharArray());

        
        KeyManagerFactory kmf = KeyManagerFactory.getInstance("GostX509");
        TrustManagerFactory tmf = TrustManagerFactory.getInstance("GostX509");
    	kmf.init(ks,  "123".toCharArray());
    	tmf.init(kst);
    	SSLContext sslContext =  SSLContext.getInstance("GostTLS");

    	sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

    	SSLSocketFactory  sslFact = (SSLSocketFactory)SSLSocketFactory.getDefault();
    	
    	
    	HttpsURLConnection.setDefaultSSLSocketFactory(sslFact);
        URL url = new URL("https://icrs.nbki.ru/signals/list");
        HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
        connection.setHostnameVerifier(new HostnameVerifier()
        {
			public boolean verify(String hostname, SSLSession session) {
				// TODO Auto-generated method stub
				return true;
			}});
        connection.setUseCaches(false);
        connection.setRequestMethod("GET");
        connection.connect();
        int responseCode = connection.getResponseCode();  /// Тут возникает ошибка!
        String responseMesssage = connection.getResponseMessage();
        
        InputStream is = connection.getInputStream();
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));
        String line;
        String response = "";
        while ((line = rd.readLine()) != null) {
            response += line + "\r\n";
        }
        rd.close();
        is.close();
        System.out.println(response);
        connection.disconnect();



В консоли ошибка
июл 12, 2018 5:42:37 PM ru.CryptoPro.ssl.am a
FINE: THROW
java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
at ru.CryptoPro.ssl.w.<init>(Unknown Source)
at ru.CryptoPro.ssl.g.b(Unknown Source)
at ru.CryptoPro.ssl.g.checkServerTrusted(Unknown Source)
at ru.CryptoPro.ssl.x.checkServerTrusted(Unknown Source)
at ru.CryptoPro.ssl.ao.a(Unknown Source)
at ru.CryptoPro.ssl.ao.a(Unknown Source)
at ru.CryptoPro.ssl.f.o(Unknown Source)
at ru.CryptoPro.ssl.f.a(Unknown Source)
at ru.CryptoPro.ssl.am.a(Unknown Source)
at ru.CryptoPro.ssl.am.i(Unknown Source)
at ru.CryptoPro.ssl.am.startHandshake(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(Unknown Source)
at testapps.TwoWaySSLTester.main(TwoWaySSLTester.java:83)
Caused by: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
at java.security.cert.PKIXParameters.setTrustAnchors(Unknown Source)
at java.security.cert.PKIXParameters.<init>(Unknown Source)
at java.security.cert.PKIXBuilderParameters.<init>(Unknown Source)
... 15 more

Вроде как, сервер удалённый сертификат предъявляет, в хранилище trust17 сертификат сервера присутствует, а выдаёт ошибку
Во вложении журнал обмена
SSL_LOG.txt (23kb) загружен 6 раз(а).

Offline Евгений Афанасьев  
#2 Оставлено : 12 июля 2018 г. 18:38:27(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Здравствуйте. в хранилище доверенных сертификатов должны быть корневые сертификаты УЦ, а не сертификат сервера. Нужно добавить сертификат УЦ, издавшего сертификат сервера.
Offline stanbel1  
#3 Оставлено : 13 июля 2018 г. 9:18:41(UTC)
stanbel1

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

Группы: Участники
Зарегистрирован: 15.12.2017(UTC)
Сообщений: 14
Откуда: Москва

Сказал(а) «Спасибо»: 1 раз
Это есть и цепочка строится
Bezymjannyjj.png (6kb) загружен 36 раз(а).
Offline Евгений Афанасьев  
#4 Оставлено : 13 июля 2018 г. 10:43:29(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Можете показать пример TwoWaySSLTester?
Offline stanbel1  
#5 Оставлено : 13 июля 2018 г. 10:52:10(UTC)
stanbel1

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

Группы: Участники
Зарегистрирован: 15.12.2017(UTC)
Сообщений: 14
Откуда: Москва

Сказал(а) «Спасибо»: 1 раз
Код:

package testapps;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.URL;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;

public class TwoWaySSLTester {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws  Exception {
/*
        System.setProperty("javax.net.ssl.trustStore", "С:\\Dev Tools\\Eclipse workspace\\NBKI-CKKI\\trust17");
        System.setProperty("javax.net.ssl.trustStoreType", "HDImageStore");
        System.setProperty("javax.net.ssl.trustStoreProvider", "JCP");
        System.setProperty("javax.net.ssl.trustStorePassword", "123");

        System.setProperty("javax.net.ssl.keyStoreType","HDImageStore");
        System.setProperty("javax.net.ssl.keyStorePassword", "123"); 
*/        
		
        System.setProperty("https.proxyHost", "172.18.0.88");
        System.setProperty("https.proxyPort", "3128");
        System.setProperty("http.proxyHost", "172.18.0.88");
        System.setProperty("http.proxyPort", "3128");
        System.setProperty("com.sun.security.enableCRLDP", "true"); // для sun jvm
        System.setProperty("javax.net.ssl.supportGVO", "true");
        
        KeyStore ks = KeyStore.getInstance("HDImageStore", "JCP"); // Тут хранится наш сертификат            
        ks.load(new FileInputStream("C:\\Dev Tools\\Eclipse workspace\\NBKI-CKKI\\bogocert"), "123".toCharArray());
    

        KeyStore kst = KeyStore.getInstance("HDImageStore", "JCP");   // тут хранится сертификат удалённого сервера         
        kst.load(new FileInputStream("C:\\Dev Tools\\Eclipse workspace\\NBKI-CKKI\\trust17"), "123".toCharArray());

        
        KeyManagerFactory kmf = KeyManagerFactory.getInstance("GostX509");
        TrustManagerFactory tmf = TrustManagerFactory.getInstance("GostX509");
    	kmf.init(ks,  "123".toCharArray());
    	tmf.init(kst);
    	SSLContext sslContext =  SSLContext.getInstance("GostTLS");

    	sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

    	SSLSocketFactory  sslFact = (SSLSocketFactory)SSLSocketFactory.getDefault();
    	
    	
    	HttpsURLConnection.setDefaultSSLSocketFactory(sslFact);
        URL url = new URL("https://icrs.nbki.ru/signals/list"); //signals--icrs
        HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
        connection.setHostnameVerifier(new HostnameVerifier()
        {
			public boolean verify(String hostname, SSLSession session) {
				// TODO Auto-generated method stub
				return true;
			}});
        
        connection.setUseCaches(false);
        connection.setRequestMethod("GET");
        connection.connect();
        int responseCode = connection.getResponseCode();  /// Тут возникает ошибка!
        String responseMesssage = connection.getResponseMessage();
        
        InputStream is = connection.getInputStream();
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));
        String line;
        String response = "";
        while ((line = rd.readLine()) != null) {
            response += line + "\r\n";
        }
        rd.close();
        is.close();
        System.out.println(response);
        connection.disconnect();
        
        
        
    	if (true) return;  // дальше не выполняем
    	SSLSocket soc = (SSLSocket) sslFact.createSocket("signals.nbki.ru", 443);
    	
    	soc.startHandshake();
    	
        BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(soc.getOutputStream(), "Windows-1251"));
        wr.write("GET list HTTP/1.0\r\n");
        wr.write("Host: signals.nbki.ru");

//        wr.write("");
//       wr.write("\r\n");
        wr.flush();        

        // Get response
        BufferedInputStream bis = new BufferedInputStream(soc.getInputStream());
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int c=0 ;
        boolean flg=false;
        while (true) {                
        c = bis.read();
        if (flg==false) {
        if (c==13) {
            c = bis.read();
            if (c==10) {
                c = bis.read();
                if (c==13) {
                    c = bis.read();
                    if (c==10) {
                        flg=true;
                        continue;
                    }                        
                }                    
            }               
        }
        } //if (!flg)
        if (c == -1) break;
        if (flg) baos.write(c);
        } //while
        
        byte[] bytedata = baos.toByteArray();
        baos.close();
        bis.close(); 
        wr.close();
        String rzxml = new String(bytedata, "windows-1251");                

        
        
    	
    	
	}

}

Offline Евгений Афанасьев  
#6 Оставлено : 16 июля 2018 г. 14:41:33(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Здравствуйте.
Искомую ошибку не получил (используется последняя сборка jcp 2.0), но были ошибки другого рода. После нескольких исправлений стал получать ошибку handshake_failure, но это по причине отсутствия клиентского сертификата:
Код:

        // System.setProperty("https.proxyHost", "172.18.0.88"); // временно убрал
        // System.setProperty("https.proxyPort", "3128"); // временно убрал
        // System.setProperty("http.proxyHost", "172.18.0.88"); // временно убрал
        // System.setProperty("http.proxyPort", "3128"); // временно убрал

        System.setProperty("com.sun.security.enableCRLDP", "true"); // для sun jvm
        System.setProperty("javax.net.ssl.supportGVO", "true");

        KeyStore ks = KeyStore.getInstance("HDImageStore", "JCP"); // Тут хранится только один наш сертификат

        // ИСПРАВЛЕНИЕ №1: в случае ключевого контейнера - параметры не нужны, т.к. отбор производится по типу контейнера и паролю, переданному в KeyManagerFactory 
        ks.load(/*new FileInputStream("C:\\Dev Tools\\Eclipse workspace\\NBKI-CKKI\\bogocert")*/null, /*"123".toCharArray()*/null); 

        // ИСПРАВЛЕНИЕ №2: тип хранилища - CertStore, а не HDImageStore 
        KeyStore kst = KeyStore.getInstance("CertStore", "JCP");
        kst.load(new FileInputStream("trust.store"), "123".toCharArray()); // хранилище доверенных сертификатов // переименовал

        KeyManagerFactory kmf = KeyManagerFactory.getInstance("GostX509");
        TrustManagerFactory tmf = TrustManagerFactory.getInstance("GostX509");

        kmf.init(ks, "123".toCharArray());
        tmf.init(kst);

        SSLContext sslContext =  SSLContext.getInstance("GostTLS");
        sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

        // ИСПРАВЛЕНИЕ №3: - создаем фабрику из SSLContext 
        SSLSocketFactory sslFact = sslContext.getSocketFactory(); // (SSLSocketFactory)SSLSocketFactory.getDefault();

        HttpsURLConnection.setDefaultSSLSocketFactory(sslFact);

        URL url = new URL("https://icrs.nbki.ru/signals/list");
        HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();

        connection.setHostnameVerifier(new HostnameVerifier() {
            public boolean verify(String hostname, SSLSession session) {
                // TODO Auto-generated method stub
                return true;
            }}
        );

        connection.setUseCaches(false);
        connection.setRequestMethod("GET");

        connection.connect();

        int responseCode = connection.getResponseCode();  // теперь handshake_failure из-за того, что отсутствует клиентский сертификат
        String responseMesssage = connection.getResponseMessage();

        InputStream is = connection.getInputStream();
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));

        String line;
        String response = "";

        while ((line = rd.readLine()) != null) {
            response += line + "\r\n";
        }

        rd.close();
        is.close();

        System.out.println(response);
        connection.disconnect();


Приложил trust.store (задал расширение txt). trust.store.txt (1kb) загружен 8 раз(а).

Отредактировано пользователем 16 июля 2018 г. 14:43:02(UTC)  | Причина: Не указана

Offline stanbel1  
#7 Оставлено : 16 июля 2018 г. 17:10:47(UTC)
stanbel1

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

Группы: Участники
Зарегистрирован: 15.12.2017(UTC)
Сообщений: 14
Откуда: Москва

Сказал(а) «Спасибо»: 1 раз
Взял Ваше trust.store и пробую выполнить код
Ошибка Exception in thread "main" javax.net.ssl.SSLException: java.lang.RuntimeException: Invalid key exchange
JCP поставил версии 2.0.39738, была 2.0.39014.zip

SSL_LOG3.txt (27kb) загружен 4 раз(а).
Offline Евгений Афанасьев  
#8 Оставлено : 16 июля 2018 г. 17:24:36(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Предположу, что установили другую java и не сняли экспортные ограничения.
Offline stanbel1  
#9 Оставлено : 16 июля 2018 г. 17:38:19(UTC)
stanbel1

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

Группы: Участники
Зарегистрирован: 15.12.2017(UTC)
Сообщений: 14
Откуда: Москва

Сказал(а) «Спасибо»: 1 раз
Да, была проблема с экспортными ограничениями
Теперь ошибка, как у Вас,Exception in thread "main" javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
При этом сертификат есть

SSL_LOG4.txt (95kb) загружен 8 раз(а).
Offline Евгений Афанасьев  
#10 Оставлено : 16 июля 2018 г. 17:51:48(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Этот сертификат не выбирается (видимо, BogomolovPK18), его издатель:
Код:

Issuer: CN=УЦ КРИПТО-ПРО (ГОСТ 2012), O="ООО \"КРИПТО-ПРО\"", L=Москва, ST=Москва, C=RU, EMAILADDRESS=cpca@cryptopro.ru

а сервер доверяет только (Cert Authorities):
Код:

<CN=Test Center CRYPTO-PRO, O=CRYPTO-PRO, C=RU, EMAILADDRESS=info@cryptopro.ru>
<CN=УЦ KPИПTO-ПPO, O=ООО КРИПТО-ПРО, L=Москва, C=RU, EMAILADDRESS=cpca@cryptopro.ru>

Отредактировано пользователем 16 июля 2018 г. 17:52:28(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.