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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline RKM  
#1 Оставлено : 17 марта 2016 г. 11:39:26(UTC)
RKM

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

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

Сказал(а) «Спасибо»: 2 раз
Здравствуйте.
Возникла необходимость в автоматическом обмене данными с сайтом госзакупок (https://int223.zakupki.gov.ru/223/integration/integration/upload).
В IE соединение устанавливается. Необходимо то же сделать программно.
Помогите, пожалуйста, разобраться или направить рабочий пример для подключения к этому сайту.

Имею:
1. Установленный КриптоПро CSP
2. JDK 8
3. JCP 2 (jcp-2.0.38674)
4. Носитель Rutoken с ключем.

По документации JCP понимания не возникло. Тема совсем не близка..
Offline Евгений Афанасьев  
#2 Оставлено : 17 марта 2016 г. 12:29:46(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Здравствуйте.
Вероятно, требуется установить защищенное (TLS) соединение клиента и сервера (zakupki).
Сначала рекомендуем посмотреть руководство по эксплуатации cpSSL (папка Doc/ЖТЯИ.00091-01-JCP в дистрибутиве, файлы "ЖТЯИ.00091-01 91 02. Инструкция по использованию (JTLS).odt" и "ЖТЯИ.00091-01 33 03. Руководство программиста (JTLS).odt", а также "ЖТЯИ.00091-01 33 01. Руководство программиста.odt", "ЖТЯИ.00091-01 90 01. Руководство администратора безопасности.odt" и "ЖТЯИ.00091-01 91 01. Инструкция по использованию.odt").
Клиентское соединение можно осуществить, например, с помощью HttpsURLConnection (+ задать параметры хранилища доверенных сертификатов и контейнера в System.setProperty), apache http client (через SSLContext) и т.п. Примеры: архив samples-sources.jar, пакет JTLS_samples.
Для работы с рутокеном после установки JCP нужно скачать их модуль поддержки (rutoken для jcp) и установить его. Установка выполнится в последние установленные JRE с установленным JCP (если последняя установленная jre/jdk - без JCP, то модуль поддержки не установится). При правильной установке в панели JCP появится закладка RutokenStore и тип хранилища RutokenStore, т.е. обращаться к контейнерам на рутокене надо будет примерно так:
Код:

KeyStore keyStore = KeyStore.getInstance("RutokenStore");
keyStore.load(null, null);
PrivateKey key = keyStore.getKey(alias, password); // ключ с рутокена

Не рекомендуется для TLS подключения использовать рутокен, т.к. особенностью реализации cpSSL является перебор контейнеров по паролю. Лучше скопировать контейнер в HDImageStore.
Offline RKM  
#3 Оставлено : 21 марта 2016 г. 13:39:25(UTC)
RKM

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

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

Сказал(а) «Спасибо»: 2 раз
Скопировать контейнер в HDImageStore не удалось: выходит сообщение
Цитата:
Key is not exportable
.
Подскажите, что неправильно в коде (debug показывает ошибку на строке int responseCode = con.getResponseCode()):
Код:
TrustManager[] trustAllCerts = { new X509TrustManager() {
                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }

                @Override
                public void checkClientTrusted(X509Certificate[] certs, String authType) {
                }

                @Override
                public void checkServerTrusted(X509Certificate[] certs, String authType) {
                }
                } };

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

            HostnameVerifier hv = new HostnameVerifier() {
                @Override
                public boolean verify(String arg0, SSLSession arg1) {
                    return true;
                }                
            };
            
            KeyStore keyStore = KeyStore.getInstance("RutokenStore");
            keyStore.load(null, null);
            PrivateKey key = (PrivateKey)keyStore.getKey("алиас", "пароль".toCharArray()); // ключ с рутокена
            System.out.println(key.getFormat());
            X509Certificate cert = (X509Certificate)keyStore.getCertificate("алиас");
            System.out.println(cert.getNotAfter().toString());
            KeyManagerFactory kmf = KeyManagerFactory.getInstance("GostX509");
            kmf.init(keyStore, "пароль".toCharArray());
            
            sslContext.init(kmf.getKeyManagers(), trustAllCerts, new SecureRandom());
            
            URL url = new URL("https://int223.zakupki.gov.ru/223/integration/integration/upload/");
            HttpsURLConnection con = (HttpsURLConnection)url.openConnection();
            con.setRequestMethod( "GET" );
            con.setHostnameVerifier(hv);
            con.setSSLSocketFactory(sslContext.getSocketFactory());
            

            int responseCode = con.getResponseCode();////тут возникает ошибка
            InputStream inputStream;
            if (responseCode == HttpsURLConnection.HTTP_OK) {
                inputStream = con.getInputStream();
            } else {
                inputStream = con.getErrorStream();
            }

            BufferedReader reader;
            String line = null;
            reader = new BufferedReader( new InputStreamReader( inputStream ) );
            while( ( line = reader.readLine() ) != null )
            {
                System.out.println( line );
            }

            inputStream.close();


текст ошибки:
Код:
debug:
мар 21, 2016 3:09:57 PM ru.CryptoPro.JCSP.JCSP <init>
INFO: Loading JCSP 4.0 38674
мар 21, 2016 3:09:57 PM ru.CryptoPro.JCSP.KeyStore.KeyStoreConfig enumInstalledProviders
WARNING: No provider with type of 80 found.
мар 21, 2016 3:09:57 PM ru.CryptoPro.JCSP.KeyStore.KeyStoreConfig enumInstalledProviders
WARNING: No provider with type of 81 found.
мар 21, 2016 3:09:58 PM ru.CryptoPro.JCSP.JCSP <init>
INFO: JCSP loaded.
мар 21, 2016 3:09:58 PM ru.CryptoPro.JCP.tools.Starter check
INFO: Loading JCP 2.0 38674
мар 21, 2016 3:09:58 PM ru.CryptoPro.JCP.tools.Starter check
INFO: JCP loaded.
null
Fri Jan 27 09:53:00 GMT+05:00 2017
мар 21, 2016 3:10:03 PM ru.CryptoPro.ssl.SSLContextImpl d
INFO: keyStore is : 
мар 21, 2016 3:10:03 PM ru.CryptoPro.ssl.SSLContextImpl d
INFO: keyStore type is : 
мар 21, 2016 3:10:03 PM ru.CryptoPro.ssl.SSLContextImpl d
INFO: keyStore provider is : 
мар 21, 2016 3:10:03 PM ru.CryptoPro.ssl.SSLContextImpl d
INFO: init key store
мар 21, 2016 3:10:03 PM ru.CryptoPro.ssl.SSLContextImpl d
INFO: defaultStoreProvider = 
мар 21, 2016 3:10:03 PM ru.CryptoPro.ssl.SSLContextImpl d
INFO: 
мар 21, 2016 3:10:03 PM ru.CryptoPro.ssl.SSLContextImpl d
INFO: init key manager of type GostX509
мар 21, 2016 3:10:03 PM ru.CryptoPro.ssl.r <init>
WARNING: %% No appropriate keys for handshake
PATH: C:\Users\RogatchevKM\Local Settings\Application Data\Crypto Pro
мар 21, 2016 3:10:03 PM ru.CryptoPro.ssl.SSLContextImpl d
INFO: trustStore is: 
мар 21, 2016 3:10:03 PM ru.CryptoPro.ssl.SSLContextImpl d
INFO: trustStore type is : 
мар 21, 2016 3:10:03 PM ru.CryptoPro.ssl.SSLContextImpl d
INFO: trustStore provider is : 
мар 21, 2016 3:10:03 PM ru.CryptoPro.ssl.SSLContextImpl d
INFO: init trust store
мар 21, 2016 3:10:03 PM ru.CryptoPro.ssl.SSLContextImpl d
INFO: init trust manager of type GostX509
мар 21, 2016 3:10:03 PM ru.CryptoPro.ssl.SSLContextImpl d
INFO: init context...
мар 21, 2016 3:10:03 PM ru.CryptoPro.ssl.SSLContextImpl d
INFO: Context initiated.
javax.net.ssl.SSLException: java.lang.UnsupportedOperationException
	at ru.CryptoPro.ssl.C.a(Unknown Source)
	at ru.CryptoPro.ssl.am.a(Unknown Source)
	at ru.CryptoPro.ssl.am.a(Unknown Source)
	at ru.CryptoPro.ssl.am.a(Unknown Source)
	at ru.CryptoPro.ssl.am.startHandshake(Unknown Source)
	at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
	at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1513)
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441)
	at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
	at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:338)
	at javaapplication2.SSLTest3.getSSLContext(SSLTest3.java:145)
	at javaapplication2.SSLTest3.initConfig(SSLTest3.java:181)
	at javaapplication2.SSLTest3.testSend(SSLTest3.java:61)
	at javaapplication2.SSLTest3.main(SSLTest3.java:50)
Caused by: java.lang.UnsupportedOperationException
	at ru.CryptoPro.Crypto.Cipher.BaseGostCipher.engineGetParameters(Unknown Source)
	at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1020)
	at javax.crypto.Cipher.init(Cipher.java:1245)
	at javax.crypto.Cipher.init(Cipher.java:1186)
	at ru.CryptoPro.ssl.a.d.a(Unknown Source)
	at ru.CryptoPro.ssl.a.f.a(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)
	... 11 more
java.lang.IllegalArgumentException: SSL context may not be null
	at org.apache.http.util.Args.notNull(Args.java:54)
	at org.apache.http.conn.ssl.SSLConnectionSocketFactory.<init>(SSLConnectionSocketFactory.java:261)
	at javaapplication2.SSLTest3.initConfig(SSLTest3.java:182)
	at javaapplication2.SSLTest3.testSend(SSLTest3.java:61)
	at javaapplication2.SSLTest3.main(SSLTest3.java:50)
Offline Евгений Афанасьев  
#4 Оставлено : 21 марта 2016 г. 15:05:50(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Не сняли ограничения на экспорт ключа. См. тут.
Offline RKM  
#5 Оставлено : 21 марта 2016 г. 16:23:48(UTC)
RKM

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

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

Сказал(а) «Спасибо»: 2 раз
спасибо, соединение установлено!
Offline RKM  
#6 Оставлено : 22 марта 2016 г. 7:34:15(UTC)
RKM

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

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

Сказал(а) «Спасибо»: 2 раз
Подскажите еще, пожалуйста, какие лицензии необходимы на сервер для работы этого модуля:

серверная лицензия JCP + серверная лицензия JavaTLS ?

CSP нет необходимости?
Offline Евгений Афанасьев  
#7 Оставлено : 22 марта 2016 г. 8:57:34(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
CSP не нужен.
Все верно: на сервере, если вы создаете серверное сокетное соединение, нужна серверная лицензия cpSSL. Если не создаете (используется только клиентское подключение) - то серверная лицензия cpSSL не нужна. Для JCP нужна лицензия в любом случае - серверная на сервере.
Offline miser  
#8 Оставлено : 23 марта 2016 г. 13:36:26(UTC)
miser

Статус: Активный участник

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

Сказал «Спасибо»: 1 раз
Поблагодарили: 7 раз в 5 постах
Цитата:
в любом случае - серверная на сервере.

Бабушка на двое сказала. Честно.
Сервер может быть сервером и не заниматься самоподписыванием и шифрованием. Зачем ему серверная лицензия? Ему и клиентской должно хватать. Разве, что, JCP считает любую Linux Desktop amd64 машину как сервер.
Да и клиентская подразумевает использование закрытых ключей. Но если TLS идет без авторизации клиента, то здесь и ключей может не быть.
Как-то так.

Если в госзакупках работать по ФЗ-44, авторизация внешней системы (клиента) не нужна. Если по ФЗ-223, авторизация внешней системы (клиента) нужна.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.