【问题标题】:Java and SSL on localhost本地主机上的 Java 和 SSL
【发布时间】:2012-11-25 22:58:13
【问题描述】:

我正在尝试在我的本地计算机上试用 SSLServerSocket 程序 - (该程序旨在使用普通套接字或基于服务器对象构造函数的单个参数的 SSL 套接字)。在纯数据中,程序完全按照预期工作,但使用 SSL:

socket.getInputStream().read();

始终返回 65535(即 0xFFFF),即使远程端已关闭。知道有什么问题吗?如果有帮助,我可以发布代码。

提前致谢

编辑:好的,现在我醒了 - 正如下面的人正确指出的那样,它是一种“断开连接”排序(isClosed 仍然返回 false 等,但输入流只有 -1)。

查看 SSL 的调试信息,我注意到了这个 gem:

***
pool-2-thread-1, WRITE: TLSv1.1 Handshake, length = 36
%% Cached server session: [Session-3, TLS_ECDHE_RSA_WITH_RC4_128_SHA]
pool-2-thread-1, received EOFException: ignored
pool-2-thread-1, called closeInternal(false)
pool-2-thread-1, SEND TLSv1.1 ALERT:  warning, description = close_notify
pool-2-thread-1, WRITE: TLSv1.1 Alert, length = 22
pool-2-thread-1, called closeSocket(selfInitiated)
After use

来自代码:

final SSLSocket socket = (SSLSocket) ((SSLServerSocket)_ServerSocket).accept();
System.out.println("Before use");
socket.getInputStream().read();
System.out.println("After use");

所以,我 - 认为 - 客户端(在本例中为浏览器)没有正确说“再见”就挂断了。

鉴于我的预期用途是基于 SSL/TLS (wss://localhost:/) 的 websocket,我尝试添加证书设置并将其添加到 Windows 7 的受信任证书中,但它似乎仍然不需要工作(html文件在我的本地系统上,并且连接到上面的wss:URL,那么keygen.exe的服务器别名应该是localhost吗?)。

知道我哪里出错了吗?

【问题讨论】:

  • 我认为 Netty 中有 websocket 实现,还有 Apache MINA、Jetty 和 Resin 框架,而不是重新发明轮子……

标签: java sockets ssl


【解决方案1】:

你错了。 read() 从不返回 0xFFFF。但是,当对等方关闭时,它会返回 -1 (0xFFFFFFFF)。请参阅 Javadoc。您需要将结果存储在 int 中,而不是 byte 中,这样您就可以将 -1 表示 EOS 与 0xFF 区分为数据字节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2016-01-16
    • 2016-04-30
    • 2011-04-01
    相关资源
    最近更新 更多