«SocketException: неподключенные сокеты не реализованы» с самозаверяющим сертификатом SSL - PullRequest
7 голосов
/ 22 сентября 2008

(я задавал тот же вопрос в списке рассылки jmeter-user, но я тоже хотел попробовать здесь - так что, по крайней мере, я могу обновить его ответом, как только найду его).

У меня проблемы с использованием JMeter для тестирования веб-приложения Tomcat с использованием самозаверяющего сертификата SSL. JMeter генерирует исключение SocketException с сообщением Unconnected sockets not implemented. Согласно документации JMeter , приложение разработано и написано для принятия любого сертификата, самоподписанного или подписанного СА или любого другого.

Кто-нибудь сталкивался с этим конкретным исключением раньше?

Я попытался экспортировать этот сертификат с сервера и импортировать его в мое локальное хранилище ключей (с помощью keytool -import -alias tomcat -file ), но результат тот же.

Я также пытался установить javax.net.debug = all в качестве аргумента JVM ( справочное руководство по JSSE перечисляет это как шаг отладки); тем не менее, я не вижу никаких результатов отладки - стоит ли ожидать чего-то другого, кроме стандартного out / error?

Ответы [ 6 ]

9 голосов
/ 04 января 2015

Большинство javax.net.SocketFactory реализаций определяют все createSocket() методы , которые имеют параметры , как абстрактные. Но есть метод createSocket() без параметров, который выглядит следующим образом:

public Socket createSocket() throws IOException {
   throw new SocketException("Unconnected sockets not implemented");
}

Поэтому, если вы подклассом абстрактного javax.net.SocketFactory, вы будете вынуждены переопределить методы с параметром, но легко пропустить переопределение метода createSocket() без параметров. Таким образом, исключение выдается, если ваш код вызывает createSocket(). Просто переопределите метод и все готово. :)

3 голосов
/ 05 июля 2011

У меня была та же проблема в моем коде (не связанная с JMeter).

В моем коде используется самоопределение SocketFactory. Я обнаружил, что класс com.sun.jndi.ldap.Connection вызывает некоторые методы SocketFactory, используя Method.invoke(). Один из методов, который он пытается вызвать - createSocket() - без параметров.

Когда я добавил такой метод на свою фабрику, все работало нормально.

2 голосов
/ 23 сентября 2008

Это скорее подсказка, чем правильный ответ. Беглый взгляд на результаты Google, по-видимому, указывает на то, что исключение обычно вызывается кодом, заставляющим использовать фабрику сокетов SSL по умолчанию, которая специально генерирует исключение, когда createSocket () вызывается на это. Некоторые результаты, по-видимому, указывают на то, что эта проблема иногда возникает из-за ошибки в определенной версии в Java 6 или из-за неправильного пути или пароля для хранилища ключей.

Итак, я бы сказал, попробуйте использовать Java 5. Кроме того, попробуйте указать JMeter на известный сайт, который использует надлежащие SSL-сертификаты. Таким образом, вы можете проверить гипотезу самозаверяющего сертификата.

0 голосов
/ 01 августа 2016

Вот мое решение (Java 1.6), полностью удаляющее шифры TLS_DHE_, принудительно переопределяет методы createSocket ()

(https://gist.github.com/hoangthienan/735afb17ffd6955de95a49aa0138dbaa)

0 голосов
/ 08 декабря 2009

Попробуйте найти в вашем classpath (в Eclipse я делаю ctrl-shift-t для этого) SSLSocketFactory * Если вы найдете его, установите его в качестве свойства в классе безопасности:

В моем окружении я нашел следующие два:

Security.setProperty("ssl.SocketFactory.provider", "com.ibm.jsse2.SSLSocketFactoryImpl");

или

Security.setProperty("ssl.SocketFactory.provider", "com.ibm.websphere.ssl.protocol.SSLSocketFactory");

(или для любого другого класса, который вы найдете)

Аналогично для ServerSocketFactory, если вам нужны серверные сокеты.

0 голосов
/ 03 сентября 2009

У меня были проблемы с веб-службой, подобные этой с jdk 1.6.0_10.

Я обновился до 1.6.0_16 и все заработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...