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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline dethklok  
#1 Оставлено : 12 октября 2016 г. 12:03:13(UTC)
dethklok

Статус: Новичок

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

Сказал(а) «Спасибо»: 1 раз
Здравствуйте!


Как задать расширение SNI (Extension server_name) для сокета крипто-про?

Код:

SSLParameters sslParameters = socket.getSSLParameters();
sslParameters.setServerNames(serverNames);
socket.setSSLParameters(Arrays.asList(new SNIHostName(url.getHost())));

так не работает.

Далее привожу детальное описание возникшей проблемы.

Есть веб-клиент, который должен работать с веб-сервисом (ГОСТ шифрование). Сервис находится на виртуальном хосте (за nginx), поэтому клиенту необходимо использовать Server Name Indication (SNI).

Код создания SSLSocketFactory:
Код:

    private SSLSocketFactory getCryptoProSSLSocketFactory() throws KeyStoreException, NoSuchAlgorithmException,
            CertificateException, FileNotFoundException, IOException, KeyManagementException {
        KeyStore trustStore = KeyStore.getInstance(JCP.CERT_STORE_NAME);
        trustStore.load(new FileInputStream(keyStoreFile), "changeit".toCharArray());
        TrustManagerFactory tmf = TrustManagerFactory.getInstance("GostX509");
        tmf.init(trustStore);
        SSLContext sslCtx = SSLContext.getInstance("GostTLS");
        sslCtx.init(null, tmf.getTrustManagers(), null);
        return sslCtx.getSocketFactory();
    }


В логах на этапе ssl-handshake:
Код:

ClientHello, TLSv1; Cipher Suites: [TLS_CIPHER_2012, TLS_CIPHER_2001, SSL3_CK_GVO_KB2]; Compression Methods: 0; Extensions: Extension ext_hash_and_mac_alg_select, ext_hash_and_mac_alg_select: [48, 32, 48, 30, 48, 8, 6, 6, 42, -123, 3, 2, 2, 9, 48, 8, 6, 6, 42, -123, 3, 2, 2, 22, 48, 8, 6, 6, 42, -123, 3, 2, 2, 23], Extension renegotiation_info, renegotiated_connection: <empty>;


Получается что в данном случае SNI не отправляется -> nginx не понимает, что нужно запрос слать к хосту веб-сервиса, и шлет запрос на дефолтовый хост, естественно все ломается.
Код:

Caused by: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
	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(HttpsClient.java:559)


Пробовал без крипто-про с обычным TLS. Все работает как надо, SNI задается:
Код:

*** ClientHello, TLSv1.2
RandomCookie:  GMT: 1459418267 bytes = { 74, 199, 110, 160, 53, 253, 254, 250, 208, 232, 10, 200, 23, 79, 97, 78, 156, 243, 136, 88, 6, 232, 10, 40, 146, 112, 82, 31 }
Session ID:  {}
Cipher Suites: [TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, TLS_EMPTY_RENEGOTIATION_INFO_SCSV]
Compression Methods:  { 0 }
Extension elliptic_curves, curve names: {secp256r1, sect163k1, sect163r2, secp192r1, secp224r1, sect233k1, sect233r1, sect283k1, sect283r1, secp384r1, sect409k1, sect409r1, secp521r1, sect571k1, sect571r1, secp160k1, secp160r1, secp160r2, sect163r1, secp192k1, sect193r1, sect193r2, secp224k1, sect239k1, secp256k1}
Extension ec_point_formats, formats: [uncompressed]
Extension signature_algorithms, signature_algorithms: SHA512withECDSA, SHA512withRSA, SHA384withECDSA, SHA384withRSA, SHA256withECDSA, SHA256withRSA, SHA224withECDSA, SHA224withRSA, SHA1withECDSA, SHA1withRSA, SHA1withDSA
]Extension server_name, server_name: [type=host_name (0), value=web-service-test.ru]
***

Здесь все установилось: Extension server_name, server_name: [type=host_name (0), value=web-service-test.ru]. Запрос дошел куда надо к веб-сервису, но естественно тут все ломается, т.к веб-сервис работает с ГОСТ
Offline Евгений Афанасьев  
#2 Оставлено : 12 октября 2016 г. 13:14:43(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Здравствуйте.
Проблема, вероятно, в том, что jcp/jtls собирается на java 6, где SSLParameters еще не содержит необходимых полей и методов (и нет SNIHostName и т.п.) и их нет и в jtls, а вы используете java 7-8.

Отредактировано пользователем 12 октября 2016 г. 13:37:00(UTC)  | Причина: Не указана

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