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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline auglov  
#1 Оставлено : 25 декабря 2014 г. 21:14:50(UTC)
auglov

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

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

Сказал(а) «Спасибо»: 3 раз
Есть клиентский сертификат с закрытым ключом, есть ресурс, который требует этот сертификат при подключении. Сертификат сервера добавлен в доверенные. Все это проделано одновременно и в КриптоПро CSP и в JCP.

Теперь если зайти IE на ресурс, то он исправно сросит сертификат, отдаст свой, отдаст содержимое страницы. Это ОК. Если зайти с тем же сертификатом на https://cpca.cryptopro.ru/tls/tls-cli.asp, то видно сообщение "Защищенное соединение установлено, Сертификат пользователя не предоставлен" - Странно.

Далее если подключиться из Java со всеми теми же сертификатами к https://cpca.cryptopro.ru/tls/tls-cli.asp, то результат тот же - "Сертификат пользователя не предоставлен", а если подключиться к требуемому ресурсу, то соединение и вовсе обрывается после отправки запроса и при попытке что-то считать из сокета. При этом в логах почему-то нет попытки сервера запросить клиентский сертификат и клиент, соответственно, его не отправляет, хотя видно, что CryptoPro про него в приципе знает.

Вот код (Scala, но не велика разница с Java):

Код:
        System.setProperty("com.sun.security.enableCRLDP", "true");
        System.setProperty("com.ibm.security.enableCRLDP", "true");

        System.setProperty("javax.net.ssl.keyStoreType", "HDImageStore");
        System.setProperty("javax.net.ssl.keyStorePassword", "1");

        System.setProperty("javax.net.ssl.trustStoreType", "HDImageStore");
        System.setProperty("javax.net.ssl.trustStorePassword", "12345");
        System.setProperty("javax.net.ssl.trustStore", "C:\\crypto_store");
        
        val url: URL = new URL(URI)
        val conn = url.openConnection.asInstanceOf[HttpsURLConnection]
        try
        {
            conn.setRequestMethod("POST")
            conn.setRequestProperty("Content-Type", "text/xml;charset=UTF-8")
            conn.setRequestProperty("X-Signature", "test") // TODO
            conn.setRequestProperty("X-Async", "1")
            conn.setRequestProperty("Accept", "text/xml; text/html; text/plain")
            conn.setRequestProperty("Accept-Charset", "UTF-8")
            conn.setDoOutput(true)
            conn.setDoInput(true)

            val data = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + // Кусок запроса пропущен
            val wr = new OutputStreamWriter(conn.getOutputStream)
            wr.write(data)
            wr.flush()
            wr.close()

            writeToFile(conn)
        }
        catch
        {
            case t: Throwable => t.printStackTrace(System.err)
        }
        finally
        {
            conn.disconnect()
        }  
        
    private def writeToFile(conn: HttpsURLConnection)
    {
        val input: BufferedInputStream = new BufferedInputStream(conn.getInputStream)
        val output: BufferedOutputStream = new BufferedOutputStream(new FileOutputStream("output.txt"))
        val buffer: Array[Byte] = new Array[Byte](1024)
        var len: Int = 0
        while ({len = input.read(buffer, 0, 1024); len} > 0)
            output.write(buffer, 0, len)
        output.flush()
        output.close()
        input.close()
    }  


Вот вывод логов: http://pastebin.com/Vi67YKYT

Если включить вывод логов в ALL, то видно, что в сокет нормально пишется весь POST-запрос, со всеми заголовками. Но все падает в момент conn.getInputStream

Что сделать, чтобы заработало? Для начала, чтобы серверу отправлялся клиентский сертификат - может, полегчает?

Offline Евгений Афанасьев  
#2 Оставлено : 26 декабря 2014 г. 8:11:16(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Здравствуйте.
Какие версии CSP, JCP, JRE у вас?

Автор: auglov Перейти к цитате

Если зайти с тем же сертификатом на https://cpca.cryptopro.ru/tls/tls-cli.asp, то видно сообщение "Защищенное соединение установлено, Сертификат пользователя не предоставлен" - Странно.

Сертификат клиента браузером запрашивается?

Автор: auglov Перейти к цитате

При этом в логах почему-то нет попытки сервера запросить клиентский сертификат и клиент, соответственно, его не отправляет

В логах есть ошибка - можно ли узнать, какая версия CSP установлена на сервере? В плане TLS у JCP 2.0 и CSP 3.6 есть разночтения до CSP 3.6 R4 в части renegotiation indication, возможно, в этом причина ошибки.

Offline auglov  
#3 Оставлено : 26 декабря 2014 г. 11:56:01(UTC)
auglov

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

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

Сказал(а) «Спасибо»: 3 раз
CSP Ядро 3.6.5365 КС2, версия 3.6.7777
JCP+JTLS 2.0.37886
JRE/JDK 1.7.0_51.

Сертификат почему-то не запрашивается.
Со стороны сервера стоит КриптоПро CSP Ядро 3.6.5364 КС1, версия 3.6.7491

Отредактировано пользователем 26 декабря 2014 г. 12:30:25(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#4 Оставлено : 26 декабря 2014 г. 12:50:58(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Попробуйте сюда: https://www.cryptopro.ru:4444/test/tls-cli.asp
Я ссоздал контейнер с ключом обмена (exchange) в JCP, сохранил запрос в base64, выпустил сертификат в тестовом УЦ https://www.cryptopro.ru/certsrv/, добавил сертификат в контейнер, установил сертификат с привязкой к ключу в My, IE вернул страницу после запроса:
Код:

Защищенное соединение установлено
Сертификат пользователя предоставлен
Issuer (Издатель) EMAIL=support@cryptopro.ru, C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2 
Subject (Владелец) C=RU, O=CryptoPro, CN=client 
SerialNumber (Серийный номер) 12-00-01-90-cf-7f-4c-d3-d9-13-fc-f6-90-00-00-00-01-90-cf 
ValidFrom (Действителен c) 26.12.2014 9:33:29  
ValidUntil (Действителен до) 26.03.2015 9:43:29 

Отредактировано пользователем 26 декабря 2014 г. 12:51:44(UTC)  | Причина: Не указана

Offline auglov  
#5 Оставлено : 26 декабря 2014 г. 13:21:57(UTC)
auglov

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

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

Сказал(а) «Спасибо»: 3 раз
Да, все работает для https://www.cryptopro.ru:4444/test/tls-cli.asp. И из браузера, и из кода. Чтобы заработало из кода, добавил сертификат сервера в хранилище доверенных C:\crypto_store.

С исходным сервером ситуация не поменялась - все так же рвется соединение. Пробовал подключаться к другим ресурсам требующим шифрования, например на zakupki.gov.ru - все везде работает, кроме нужного мне сервера. Единственная наблюдаемая принципиальная разница - я к нему цепляюсь по IP, а к другим по доменному имени. Возможно, это как-то влияет на что-то.

Думал еще про возможные проблемы с сетью, но, с другой стороны, если была бы какая-то проблема в настройках сети или маршрутизации, то из браузера бы ничего тоже не работало, однако работает хорошо. Так что пока остается только версия, что есть какая-то разница в работе CSP и JTLS имеющихся версий.

Отредактировано пользователем 26 декабря 2014 г. 15:55:36(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#6 Оставлено : 27 декабря 2014 г. 19:08:24(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Если есть возможность, то попробуйте
1) использовать, например, JCP/JTLS 1.0.54;
2) узнать, нет ли в системном журнале сервера сообщений от CSP об ошибках.
Offline auglov  
#7 Оставлено : 29 декабря 2014 г. 15:56:29(UTC)
auglov

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

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

Сказал(а) «Спасибо»: 3 раз
2. Есть сообщения вида: CryptoPro TLS. Invalid renegotiation info received
Offline Евгений Афанасьев  
#8 Оставлено : 29 декабря 2014 г. 16:05:08(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Автор: auglov Перейти к цитате

Со стороны сервера стоит КриптоПро CSP Ядро 3.6.5364 КС1, версия 3.6.7491


Автор: afev Перейти к цитате
В плане TLS у JCP 2.0 и CSP 3.6 есть разночтения до CSP 3.6 R4 в части renegotiation indication, возможно, в этом причина ошибки.


Попробуйте JCP/JTLS 1.0.54 - он не шлет расширение. Либо на сервере нужно попробовать обновить CSP до R4 (7777).

Отредактировано пользователем 29 декабря 2014 г. 16:09:42(UTC)  | Причина: Не указана

Offline auglov  
#9 Оставлено : 29 декабря 2014 г. 16:10:34(UTC)
auglov

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

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

Сказал(а) «Спасибо»: 3 раз
На сервере стоит КриптоПро CSP Ядро 3.6.5364 КС1, версия 3.6.7491. Только что со стороны сервера в CSP включили поддержку RFC 5746 - и все получилось, соединение установилось, GET-запрос что-то вернул осмысленное. Ура.

Осталось разобраться с POST-запросом - пока возвращает HTTP-400, но это уже наши особенности, наверное, с шифрованием, надеюсь, никак не связанные.

Отредактировано пользователем 29 декабря 2014 г. 16:12:47(UTC)  | Причина: Не указана

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