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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline comdiv  
#1 Оставлено : 29 ноября 2018 г. 15:37:57(UTC)
comdiv

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

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

Сказал(а) «Спасибо»: 1 раз
Вопрос наверняка очень "любительский" и очевидный для опытных разработчиков.
Возможно ответ есть где-то в документации, но я не нашел.

Впервые сталкиваемся с необходимостью работать с CryptoPRO, просто для доступа по REST к веб-сервису, использующему для SSL сертификат CryptoPRO с алгоритмом GOST_512



1. Установили в JDK/JRE (1.8) JCP версии 2.0.39014, провайдер появился в списке провайдеров в java.security
2. При установке не указывали никаких лицензий (все поставилось так)
3. Пробуем по-простому (тут Kotlin, но это никакой разницы):

Цитата:

val sslContext = SSLContextBuilder().loadTrustMaterial(null,
TrustAllStrategy.INSTANCE).build()
val sslSocketFactory = SSLConnectionSocketFactory(
sslContext, NoopHostnameVerifier.INSTANCE)
val client = HttpClients.custom().setSSLSocketFactory(sslSocketFactory).build()
val httpPost = HttpPost("https://SOMEHOST/api")
val response = client.execute(httpPost)
try {
val entity2 = response.getEntity()
EntityUtils.consume(entity2)
} finally {
response.close()
}


Все падает с ошибкой:

Цитата:

javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: Certificates does not conform to algorithm constraints

at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1514)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1026)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:961)



Если залезть дебагером, то алгоритм там 1.2.643.7.1.1.3.3 , а в ограничениях одни лишь SHA различной природы.

Прошу подсказать как вообще это дело запускать?

При этом в коде явно указано следующее:

Цитата:

Security.setProperty("ssl.KeyManagerFactory.algorithm", "GostX509");
Security.setProperty("ssl.TrustManagerFactory.algorithm", "GostX509");
Security.setProperty("ssl.SocketFactory.provider", "ru.CryptoPro.ssl.SSLSocketFactoryImpl");
Security.setProperty("ssl.ServerSocketFactory.provider", "ru.CryptoPro.ssl.SSLServerSocketFactoryImpl");

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

Offline Евгений Афанасьев  
#2 Оставлено : 30 ноября 2018 г. 9:16:55(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Здравствуйте.
Случайно bouncycastle в java.security не прописан?
Можете предоставить SOMEHOST или хотя бы серверный сертификат посмотреть?
Offline comdiv  
#3 Оставлено : 30 ноября 2018 г. 10:03:13(UTC)
comdiv

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

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

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

После долгих мытарств

1. У меня было 100500 JRE и я естественно ставил JCP в одну а тестировал потом в другой...

2. В итоге вот какой вывод: если не нужно ничего кроме просто соединения с неким сайтом (без клиентского сертификата и без проверки валидности сертификата сайта), то все достаточно просто.



Вот вполне рабочий код (ничего кроме провайдера не должно быть в java.security и не требуется выставлять никаких Security.setProperty)

Цитата:


val client = HttpClients.custom().setSSLSocketFactory(SSLConnectionSocketFactory(SSLContext.getInstance("GostTLS").apply {
init(KeyManagerFactory.getInstance("GostX509").apply {
init(KeyStore.getInstance("HDImageStore", "JCP"), charArrayOf())
}.keyManagers, arrayOf(TrustAllCertManager), java.security.SecureRandom())
}, AllHostValid)).build()




Тут из неочевидного:

1. KeyStore совершенно не обязательно инциализировать (!) и загружать. Он так и остается не проинициализированным, но и нельзя его передавать как null или грузить какой-то иной тип (будет несовместимость)

2. TrustAllCertManager и AllHostValid это просто мои пустые реализации X509ExtendedTrustManager и HostnameVerifier, просто чтобы еще и с этим не морочиться
Offline Евгений Афанасьев  
#4 Оставлено : 30 ноября 2018 г. 11:58:19(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Автор: comdiv Перейти к цитате

1. У меня было 100500 JRE и я естественно ставил JCP в одну а тестировал потом в другой...

Тут, возможно, помогло бы использование jcp 2.0-A (для java 10 и выше), установка в java не производится.
На счет инициализации KeyStore - если нет клиентской аутентификации, то он действительно не нужен, например, SSLContext.init() принимает даже null.

Offline comdiv  
#5 Оставлено : 3 декабря 2018 г. 6:59:48(UTC)
comdiv

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

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

Сказал(а) «Спасибо»: 1 раз
Автор: Евгений Афанасьев Перейти к цитате

На счет инициализации KeyStore - если нет клиентской аутентификации, то он действительно не нужен, например, SSLContext.init() принимает даже null.


Не совсем так. SSLContext.init() принимает, но потом при попытке соединения (видимо провайдер уже CP) требует чтобы там был не null
Offline Евгений Афанасьев  
#6 Оставлено : 3 декабря 2018 г. 7:09:25(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Автор: comdiv Перейти к цитате
Автор: Евгений Афанасьев Перейти к цитате

На счет инициализации KeyStore - если нет клиентской аутентификации, то он действительно не нужен, например, SSLContext.init() принимает даже null.


Не совсем так. SSLContext.init() принимает, но потом при попытке соединения (видимо провайдер уже CP) требует чтобы там был не null

Не могли бы вы привести стек ошибки?

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
comdiv оставлено 05.12.2018(UTC)
Offline comdiv  
#7 Оставлено : 5 декабря 2018 г. 16:35:38(UTC)
comdiv

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

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

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