2015-08-18 4 views
1

В настоящее время у меня есть приложение, которое будет отправлять HTTP-запрос на множество URL-адресов. Некоторые из соединений не работают со следующим исключением.Как установить «jsse.enableSNIExtension» в false только для одного HTTPURLConnection?

Исключение в потоке "основного" javax.net.ssl.SSLProtocolException: рукопожатие предупреждение: unrecognized_name на sun.security.ssl.ClientHandshaker.handshakeAlert (ClientHandshaker.java:1410) в sun.security.ssl .SSLSocketImpl.recvAlert (SSLSocketImpl.java:2004) на sun.security.ssl.SSLSocketImpl.readRecord (SSLSocketImpl.java:1113) на sun.security.ssl.SSLSocketImpl.performInitialHandshake (SSLSocketImpl.java:1363) на sun.security.ssl.SSLSocketImpl.startHandshake (SSLSocketImpl.java:1391)

. , ,

Следовательно, я хочу установить «jsse.enableSNIExtension» в false только для определенных соединений, которые вызывают вышеупомянутое исключение.

Как это сделать на уровне HTTPsURLConnection/SSLSocket?

Код

URL url = new URL("https://artofskinmd.localgiftcards.com/"); 
HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection(); 

httpConnection.connect(); 

Я пытаюсь найти способ изменить SSLParameters для объекта HttpsURLConnection. Но я не могу найти какой-либо метод setSSLParameters() для установки пустого списка имен серверов. Я не могу найти что-либо в Интернете при настройке SSLParameters для HttpURLConnection, SSLContext и т. Д.

+0

Если вы [не знаю, что последствия безопасности делать этого являются] (http://stackoverflow.com/q/32067124/207421), почему вы спрашиваете? – EJP

+0

Другой вопрос освещает проблемы безопасности с установкой свойства системы jsse. Этот вопрос будет полезен в случае отсутствия высокого риска безопасности при подходе. – Sashwat

+1

В соответствии с немного более старым исходным кодом, который у меня есть и проверен javap для 7u80 и 8u51, 'private final static boolean enableSNIExtension' в' sun.security.ssl.ClientHandshaker' инициализируется только тогда, когда класс загружен **, и есть нет API для его изменения. Untested, но если вы не находитесь под SecurityManager (например,браузерный апплет), он * должен * работать, чтобы использовать отражение, чтобы временно скрыть это. Если какой-либо другой поток (ы) мог бы сделать (клиент) SSL/TLS одновременно, вам нужно mutex; это просто и понятно для синхронизации на «ClientHandshaker.class». –

ответ

2

Очевидно, что сайт зависит от SNI, иначе ему было бы безразлично имя, отправленное клиентом в расширении SNI. Это означает, что отключение расширения, вероятно, не поможет, но вместо этого вы либо получите отказ от рукопожатия, либо какой-либо сайт по умолчанию (и сертификат) и, возможно, не тот сайт, который вы намеревались. Чтобы устранить проблему, вы не должны отключать SNI, но вместо этого используйте правильное имя, то есть имя, ожидаемое сайтом.

Редактировать: Это выглядит как плохая конфигурация сервера вместе с ошибкой в ​​Java7 и Java8. Доступ к URL-адресу https://artofskinmd.localgiftcards.com/ приведет к неизвестному сообщению TLS предупреждение, которое Java7 и Java8 ошибочно считают фатальным (то же самое, что и старый OpenSSL 0.9.8). Отключение SNI действительно поможет в этом случае, но, похоже, нет способа отключить SNI для одного объекта HttpURLConnection.

+0

Основываясь на моем чтении, это проблема с конфигурацией сервера. Ссылка: http://javaresolutions.blogspot.ie/2014/07/javaxnetsslsslprotocolexception.html Поскольку у меня нет доступа к серверу, я не смогу изменить конфигурацию сервера. Есть ли способ увидеть, какое имя сервера принимает хост? – Sashwat

+0

@Sashwat: сервер настроен только для принятия некоторых имен хостов и отклонит все остальное (в том числе SNI) с неизвестным именем. Это допустимая конфигурация. И нет, вы не можете определить, какие имена будут приниматься сервером, но вы можете попробовать все имена, которые разрешают один и тот же IP-адрес. К сожалению, нет простого способа получить эти имена :( –

+0

@Sashwat: адрес, который вы дали ('artofskinmd.localgiftcards.com'), не имеет проблем с SNI. Если вы получили неизвестное имя для этого URL-адреса, что-то еще не так. –