我最近正在开发 Openfire 客户端。我遇到了这个奇怪的问题,到目前为止我还无法弄清楚(我有一些线索,但仍然没有可靠的解决方案)。 我们有 2 个 openfire 服务器:
- 首先,我们用于测试的它托管在通过 adsl 连接到互联网的普通电脑上,服务器位于 NAT 之后,一切配置顺利,工作完美。我们的客户可以正常连接。
- 第二台(我们称之为生产)专业专用服务器位于德国某处,安装了 OF,操作系统与测试服务器相同,OF 以完全相同的方式设置
现在,当从我们的客户端连接到生产环境时,我们在尝试进行身份验证时遇到了以下问题:
javax.net.ssl.SSLException: Received fatal alert: internal_error at sun.security.ssl.Alerts.getSSLException(Unknown Source) at sun.security.ssl.Alerts.getSSLException(Unknown Source) at sun.security.ssl.SSLSocketImpl.recvAlert(Unknown Source) at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source) at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source) at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source) at org.jivesoftware.smack.XMPPConnection.proceedTLSReceived(XMPPConnection.java:806) at org.jivesoftware.smack.PacketReader.parsePackets(PacketReader.java:267) at org.jivesoftware.smack.PacketReader.access$000(PacketReader.java:43) at org.jivesoftware.smack.PacketReader$1.run(PacketReader.java:70) java.lang.IllegalStateException: Not connected to server. at org.jivesoftware.smack.XMPPConnection.sendPacket(XMPPConnection.java:445) at org.jivesoftware.smack.NonSASLAuthentication.authenticate(NonSASLAuthentication.java:69) at org.jivesoftware.smack.SASLAuthentication.authenticate(SASLAuthentication.java:352) at org.jivesoftware.smack.XMPPConnection.login(XMPPConnection.java:203) at Main.connectToJabber(Main.java:31) at Main.main(Main.java:16) Exception in thread "main" java.lang.IllegalStateException: Not connected to server. at org.jivesoftware.smack.XMPPConnection.sendPacket(XMPPConnection.java:445) at org.jivesoftware.smack.NonSASLAuthentication.authenticate(NonSASLAuthentication.java:69) at org.jivesoftware.smack.SASLAuthentication.authenticate(SASLAuthentication.java:362) at org.jivesoftware.smack.XMPPConnection.login(XMPPConnection.java:203) at Main.connectToJabber(Main.java:31) at 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
其中一个想法是它必须对证书做一些事情。
任何提示或想法都受到高度重视
最佳答案
糟糕的解决方案!因为您不知道连接速度,并且如果在早期建立连接,您也会阻止您的应用程序继续登录。
我现在可以提供的解决方案是 addConnectionListener
并在 'reconnectionSuccessful()' 函数中调用 login()
,我希望这个函数不会是第一次调用就在连接断开并再次连接后!如果没有,则表明 smack 库的架构很糟糕。
关于java - 从 java-smack 客户端连接到 Openfire 时发生 SSL 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8862692/