Ошибка SSL при подключении к Openfire из клиента java-smack - PullRequest
2 голосов
/ 14 января 2012

Я недавно работаю над клиентом Openfire. У меня есть эта странная проблема, которую я до сих пор не мог понять (у меня есть некоторые подсказки, но все еще нет твердого решения). У нас есть 2 сервера openfire:

  • Первое, что мы использовали для тестирования, было размещено на обычном ПК, подключенном к интернету через adsl, сервер находился за NAT, все настроено плавно, работает отлично. Наш клиент подключался без проблем.
  • второй (назовем его производственным) профессиональный выделенный сервер, расположенный где-то в Германии с установленной OF, той же ОС, что и на тестовой, с настройкой OF точно так же

Теперь при подключении к продукции от нашего клиента у нас возникла следующая проблема при попытке аутентификации:

javax.net.ssl.SSLException: получено фатальное предупреждение: internal_error at sun.security.ssl.Alerts.getSSLException (неизвестный источник) at sun.security.ssl.Alerts.getSSLException (неизвестный источник) at sun.security.ssl.SSLSocketImpl.recvAlert (неизвестный источник) at sun.security.ssl.SSLSocketImpl.readRecord (неизвестный источник) at sun.security.ssl.SSLSocketImpl.performInitialHandshake (неизвестный источник) at sun.security.ssl.SSLSocketImpl.startHandshake (неизвестный источник) at sun.security.ssl.SSLSocketImpl.startHandshake (неизвестный источник) в org.jivesoftware.smack.XMPPConnection.proceedTLSReceived (XMPPConnection.java:806) в org.jivesoftware.smack.PacketReader.parsePackets (PacketReader.java:267) в org.jivesoftware.smack.PacketReader.access $ 000 (PacketReader.java:43) в org.jivesoftware.smack.PacketReader $ 1.run (PacketReader.java:70) java.lang.IllegalStateException: не подключен к серверу. в org.jivesoftware.smack.XMPPConnection.sendPacket (XMPPConnection.java:445) в org.jivesoftware.smack.NonSASLAuthentication.authenticate (NonSASLAuthentication.java:69) в org.jivesoftware.smack.SASLAuthentication.authenticate (SASLAuthentication.java:352) в org.jivesoftware.smack.XMPPConnection.login (XMPPConnection.java:203) на Main.connectToJabber (Main.java:31) в Main.main (Main.java:16) Исключение в потоке "main" java.lang.IllegalStateException: Не подключен к серверу. в org.jivesoftware.smack.XMPPConnection.sendPacket (XMPPConnection.java:445) в org.jivesoftware.smack.NonSASLAuthentication.authenticate (NonSASLAuthentication.java:69) в org.jivesoftware.smack.SASLAuthentication.authenticate (SASLAuthentication.java:362) в org.jivesoftware.smack.XMPPConnection.login (XMPPConnection.java:203) на Main.connectToJabber (Main.java:31) в Main.main (Main.java:16)

Теперь самая забавная часть: когда я подключаюсь к производственному серверу с помощью нашего клиента из моей квартиры, я не вижу этой ошибки, когда мы подключаемся к производственной от другой квартиры разработчика, у нас появляется эта ошибка, мы есть разные интернет-провайдеры (я не знаю, может ли это как-то связано с этим). Мы провели всю ночь, глядя на это и до сих пор не поняли. Мы написали основной код, чтобы проверить соединение:

public static void connect() {
    ConnectionConfiguration cc = new ConnectionConfiguration("prod ip",
            5222);
    cc.setCompressionEnabled(true);
    cc.setSASLAuthenticationEnabled(true);
    Connection connection = new XMPPConnection(cc);
    try {
        connection.connect();
        connection.login(login, pass, "resource");
        System.out.println(connection.isSecureConnection() +  " " + connection.isUsingCompression());

    } catch (XMPPException e1) {
        e1.getStackTrace();
    }
}

Некоторые наблюдения:

  • Когда прокомментирована строка connection.login (...), ошибки нет, поэтому все, что вызывает ошибку, присутствует
  • При подключении сервера тестирования System.out ... пишет true false,
  • При подключении к производственному серверу System.out ... пишет false false
  • Пробовал со всеми комбинациями: cc.setCompressionEnabled () cc.setSASLAuthenticationEnabled (); (правда, правда, ложь правда, правда ложь, ложь ложь)
  • несмотря на ошибку, пользователь вошел в систему Подведем итог:

Связь со средой тестирования работает всегда, с производством: с моего места - нет проблем, в другом месте - упомянутая ошибка, мы используем SMACK API 3.2.1

Одна из идей заключалась в том, что он должен что-то делать с сертификатами.

Любые намеки или идеи высоко ценится

Ответы [ 3 ]

2 голосов
/ 03 марта 2014

Плохое плохое решение! потому что вы не знаете скорость соединения, а также не позволяете приложению продолжать вход в систему, если соединение установлено в ранние моменты. Решение, которое я могу предложить на данный момент, - это addConnectionListener и вызов login() в функцииconnectionSuccessful (), и я надеюсь, что эта функция будет вызываться в первый раз, не только после разрыва соединения и повторного подключения! если нет, то это показывает плохую архитектуру библиотеки smack.

1 голос
/ 15 января 2012

Возможно, sleep(x) между вызовами connect() и login() может это исправить. Несколько секунд для sleep() должно быть достаточно. Источник

0 голосов
/ 03 марта 2014

Я также использую режим сна после connect () также ... это не идеальный вариант, но это надежный обходной путь.

...