从java-smack客户端连接到Openfire时出现SSL错误

时间:2012-01-14 14:05:16

标签: java ssl xmpp openfire smack

我最近在开发Openfire客户端。我有这个奇怪的问题,到目前为止我无法弄清楚(我有一些线索,但仍然没有坚实的解决方案)。 我们有2台openfire服务器:

  • 首先我们用于测试它是在通过adsl连接到互联网的普通电脑上托管,服务器在NAT后面,一切配置顺利,工作完美。我们的客户连接没有任何问题。
  • 第二个(我们称之为生产)位于德国某处的专业专用服务器,具有OF instaled,与测试版相同的操作系统,OF以完全相同的方式设置

现在,当我们从客户端连接到生产时,我们在尝试进行身份验证时遇到了以下问题:

  

javax.net.ssl.SSLException:收到致命警报:internal_error       在sun.security.ssl.Alerts.getSSLException(未知来源)       在sun.security.ssl.Alerts.getSSLException(未知来源)       at sun.security.ssl.SSLSocketImpl.recvAlert(Unknown Source)       at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)       at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)       在sun.security.ssl.SSLSocketImpl.startHandshake(未知来源)       在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();
    }
}

一些观察结果:

  • 当line connection.login(...)注释时,没有错误,所以导致错误的是
  • 连接测试服务器时System.out ...写入true false,
  • 连接生产服务器时System.out ...写入false false
  • 尝试使用以下所有组合:cc.setCompressionEnabled()cc.setSASLAuthenticationEnabled(); (true,true,false true,true false,false false)
  • 尽管有错误,但用户已登录 总结一下:

与测试环境的连接始终有效,生产:从我的位置 - 没问题,其他位置 - 提到的错误, 我们使用SMACK API 3.2.1

其中一个想法是它必须对证书做些什么。

高度评价的任何提示或想法

3 个答案:

答案 0 :(得分:2)

糟糕的解决方案!因为你不知道连接速度,并且如果在早期建立连接,你也会停止你的应用继续登录。 我现在可以提供的解决方案是addConnectionListener并在'reconnectionSuccessful()'函数中调用login(),我希望这个函数不会在连接丢失和再次连接后第一次调用!如果没有,它显示了smack库的糟糕架构。

答案 1 :(得分:1)

sleep(x)connect()来电之间的login()可能会解决这个问题。 sleep()的几秒钟应该足够了。 Source

答案 2 :(得分:0)

我也在connect()之后使用睡眠......这不太理想,但这是一个可靠的解决方法。