Java SSLSocket的问题
我目前正在从事一个客户机-服务器项目。Java SSLSocket的问题,java,sockets,ssl,networking,sslsocketfactory,Java,Sockets,Ssl,Networking,Sslsocketfactory,我目前正在从事一个客户机-服务器项目。 出于安全原因,我决定使用SSL 我尝试将所有Socket和ServerSocket对象转换为它们的SSL变体,但没有成功。 当我使用 SSLVIEVSocket < /代码>并连接到它时,服务器端的套接字输出在 OutPuthFrase.Wrad(Byth[]) 中冻结。 下面是我用来创建SSL套接字的函数, ContextController.CONTEXT是SSLContext和常量。DEBUG是切换SSL的快速方法: public static Se
出于安全原因,我决定使用SSL 我尝试将所有
Socket
和ServerSocket
对象转换为它们的SSL变体,但没有成功。当我使用<代码> SSLVIEVSocket < /代码>并连接到它时,服务器端的套接字输出在
ContextController.CONTEXT
是SSLContext
和常量。DEBUG
是切换SSL的快速方法:
public static ServerSocket server(int port, int backlog) throws IOException {
return Constants.DEBUG ? new ServerSocket(port, backlog) : CONTEXT.getServerSocketFactory().createServerSocket(port, backlog);
}
public static Socket client(InetSocketAddress address) throws IOException {
return Constants.DEBUG ? new Socket(address.getHostName(), address.getPort())
: ContextController.CONTEXT.getSocketFactory().createSocket(address.getHostName(), address.getPort());
}
public static Socket client() throws IOException {
return Constants.DEBUG ? new Socket() : ContextController.CONTEXT.getSocketFactory().createSocket();
}
当Constants.DEBUG=true
(即SSL关闭)时,它工作,但当SSL打开时,它在无限期发送一些数据后会冻结,如上所述。我怎样才能解决这个问题
编辑:以下是
ContextController.CONTEXT
:(注意,我知道我应该使用一个实际的
TrustManager
,但首先我希望它起作用)
编辑2:下面是它冻结位置的堆栈跟踪,注意它没有崩溃,而是挂起:
Thread [ClientExecThread #0] (Suspended)
owns: AppOutputStream (id=54)
owns: ByteArrayOutputStream (id=55)
SocketOutputStream.socketWrite0(FileDescriptor, byte[], int, int) line: not available [native method]
SocketOutputStream.socketWrite(byte[], int, int) line: 111
SocketOutputStream.write(byte[], int, int) line: 155
OutputRecord.writeBuffer(OutputStream, byte[], int, int, int) line: 431
OutputRecord.write(OutputStream, boolean, ByteArrayOutputStream) line: 417
SSLSocketImpl.writeRecordInternal(OutputRecord, boolean) line: 876
SSLSocketImpl.writeRecord(OutputRecord, boolean) line: 847
AppOutputStream.write(byte[], int, int) line: 123
ByteArrayOutputStream.writeTo(OutputStream) line: 167
SocketStream.streamPacket(Packet) line: 181
ClientThread.lambda$8(Group) line: 150
1427646530.run(Object) line: not available
ClientThread.execute() line: 444
ClientThread$ClientExecThread.run() line: 261
我在SocketStream.streamPacket(Packet)181后面的行中放置了一个断点,但它从未到达。我真的不知道为什么会发生这种情况,我不需要SSL的所有方面(只有加密部分,这就是为什么我没有实现
信任管理器
),所以我决定实现一个Diffie Hellman
这符合预期,并结合DH和AES,我已根据我的要求对流量进行加密
谢谢大家的帮助 我们可以看看ContextController.CONTEXT的样子吗?使用
SSLContext.getInstance(“TLS”)代码>而不是“SSL”
。另外,在定义服务器时,请实现TrustManager
。因为您没有提供任何错误,所以很难判断实际发生了什么。这就是问题所在,没有错误。它只是冻结。对等方是否正在进行任何读取?Java SocketOutputStream调用OS TCP/IP堆栈进行发送,如果发送缓冲区已满且接收方未接受(确认)数据,则会阻止发送。
Thread [ClientExecThread #0] (Suspended)
owns: AppOutputStream (id=54)
owns: ByteArrayOutputStream (id=55)
SocketOutputStream.socketWrite0(FileDescriptor, byte[], int, int) line: not available [native method]
SocketOutputStream.socketWrite(byte[], int, int) line: 111
SocketOutputStream.write(byte[], int, int) line: 155
OutputRecord.writeBuffer(OutputStream, byte[], int, int, int) line: 431
OutputRecord.write(OutputStream, boolean, ByteArrayOutputStream) line: 417
SSLSocketImpl.writeRecordInternal(OutputRecord, boolean) line: 876
SSLSocketImpl.writeRecord(OutputRecord, boolean) line: 847
AppOutputStream.write(byte[], int, int) line: 123
ByteArrayOutputStream.writeTo(OutputStream) line: 167
SocketStream.streamPacket(Packet) line: 181
ClientThread.lambda$8(Group) line: 150
1427646530.run(Object) line: not available
ClientThread.execute() line: 444
ClientThread$ClientExecThread.run() line: 261