【问题标题】:What's the difference between Windows and Linux/OS X when using the Java SSLSocket?使用 Java SSLSocket 时,Windows 和 Linux/OS X 有什么区别?
【发布时间】:2017-03-05 03:54:15
【问题描述】:

我在Windows下写了一个基于Java的多服务器聊天系统。在安全部分,我创建了一个密钥库来创建 SSLSocket。当我启动 3 台服务器时,它可以在 Windows(Win10 14393.321)上运行,但在 OS X(版本 10.12(16A323))和 Linux(Ubuntu 14.04.4 LTS)上失败。这真的让我很困惑。这是密钥库部分:

System.setProperty("javax.net.ssl.keyStore",keyFilepath);
System.setProperty("javax.net.ssl.trustStore",keyFilepath);
System.setProperty("javax.net.ssl.keyStorePassword","password");
System.setProperty("javax.net.ssl.trustStorePassword", "password");

当我在 OS X 或 Linux 上运行第三台服务器时,它显示:

java.net.ConnectException:连接被拒绝

在 java.net.PlainSocketImpl.socketConnect(Native Method) 在 java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 在 java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 在 java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 在 java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 在 java.net.Socket.connect(Socket.java:589) 在 sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:668) 在 sun.security.ssl.SSLSocketImpl.(SSLSocketImpl.java:427) 在 sun.security.ssl.SSLSocketFactoryImpl.createSocket(SSLSocketFactoryImpl.java:88) 在 server.AuthorizeServer.MessageReceive(AuthorizeServer.java:99) 在 server.AuthorizeServer.main(AuthorizeServer.java:64) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)

这是我第一次在 StackOverflow 上提问,我非常期待您的帮助。 谢谢!

【问题讨论】:

  • 我认为最好在你的问题中说出你测试过的 Windows、OS X 和 Linux 的版本,在哪里成功,哪里失败。
  • 好的,谢谢。我已经添加了。
  • 不同的是,失败的情况是在 TCP 级别连接失败,因为 IP:port 错误或者没有任何监听。您的密钥库、信任库、SSLSocket、JSSE 或 Java 都与它无关。
  • @EJP 你是对的。这是端口问题。我将服务器端口设置为 80 并在命令之前使用了 'sudo' 并且它起作用了。但是我仍然有点困惑,为什么像“5544”这样的其他端口不起作用(但在 Windows 上工作)?
  • 在不知道您在说什么的情况下无法发表评论。

标签: java linux macos sockets ssl


【解决方案1】:

java.net.ConnectException:连接被拒绝

连接被拒绝是来自 TCP 堆栈的错误消息,表示它无法通过 TCP 连接到另一端。由于 SSL/TLS 是 TCP 之上的一层,并且只有在 TCP 连接成功后才会启动,这意味着问题不是由 SSL/TLS 层的不同行为引起的。

这不是 SSL 层造成的,而是 TCP 层也可以通过堆栈跟踪看到:Connection denied at java.net.PlainSocketImpl.socketConnect

更有可能是有东西阻塞了 TCP 连接(防火墙),或者您尝试侦听/连接到错误的 IP 地址(例如,尝试从 Linux 系统访问在 Windows 上侦听 127.0.0.1 的服务器)。但从目前提供的信息中无法说出具体情况。

【讨论】:

  • 其实如果我把SSLSocket改成普通Socket,系统就可以正常工作了。
  • @CrazyEric:这真的很奇怪,因为根据堆栈跟踪,问题是由普通套接字连接引起的:Connection denied at java.net.PlainSocketImpl.socketConnect,即在任何之前SSL/TLS 的东西已经完成。我认为您需要提供a minimal, complete and verifieable example,以便人们可以看到您实际在做什么。
  • 谢谢,我将服务器端口改为'80'并添加'sudo',问题就解决了。
猜你喜欢
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-02
  • 2010-09-16
  • 1970-01-01
  • 2013-02-12
  • 2019-06-08
相关资源
最近更新 更多