【问题标题】:SSL error while connecting to Openfire from java-smack client从 java-smack 客户端连接到 Openfire 时出现 SSL 错误
【发布时间】:2012-02-10 08:55:37
【问题描述】:

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

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

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

javax.net.ssl.SSLException:收到致命警报:internal_error 在 sun.security.ssl.Alerts.getSSLException(未知来源) 在 sun.security.ssl.Alerts.getSSLException(未知来源) 在 sun.security.ssl.SSLSocketImpl.recvAlert(未知来源) 在 sun.security.ssl.SSLSocketImpl.readRecord(未知来源) 在 sun.security.ssl.SSLSocketImpl.performInitialHandshake(未知来源) 在 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) 线程“主”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(); (真、真、假、真、假、假)
  • 尽管出现错误,但用户已登录 总结一下:

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

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

任何高度赞赏的提示或想法

【问题讨论】:

  • 我已经回答过了,这个问题没有如你所见(或没有)回答
  • 不知道您所说的“或不”是什么意思,但您是否尝试在connectlogin 之间“睡觉”?这可能是一种解决方法,或者只是证明您有同样的问题!
  • 嗯,显然它可以工作,在我们的例子中 2000 毫秒就足够了,对不起我之前的帖子,我们花了 12 小时没有成功,我已经看了 10 次这个线程,我猜无论如何,“未回答”让我认为它没有帮助,现在我想知道为什么当我们尝试连接到测试服务器时一切都很好
  • 嗯,可能是网络延迟的问题?我只是看看smack代码(连接方法)......

标签: java ssl xmpp openfire smack


【解决方案1】:

我也在 connect() 之后也使用了 sleep... 这不是很理想,但它是一种可靠的解决方法。

【讨论】:

    【解决方案2】:

    糟糕的糟糕解决方案!因为你不知道连接速度,如果连接在早期建立,你也会阻止你的应用程序继续登录。 我现在可以提供的一个解决方案是addConnectionListener 并在'reconnectionSuccessful()' 函数中调用login(),我希望这个函数将第一次调用,而不仅仅是在连接断开并再次连接之后!如果不是,则说明 smack 库的架构不好。

    【讨论】:

      【解决方案3】:

      也许connect()login() 调用之间的sleep(x) 可以解决此问题。 sleep() 几秒钟就足够了。 Source

      【讨论】:

      • 是的,这就是解决方案,但是 x 会有所不同,必须根据情况进行检查
      猜你喜欢
      • 1970-01-01
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多