setUseClientMode 是什么意思
What does setUseClientMode mean
当我尝试将现有套接字连接升级为 SSLSocket 连接并设置 setUseClientMode(true)
时,调用 mySSLSocket.startHandshake();
时出现错误 javax.net.ssl.SSLProtocolException: Handshake message sequence violation, 1
。当不设置 setUseClientMode()
时一切正常,我可以发送和接收消息。我不是在要求修复,只是它的含义以及可能导致它的原因。
setUseClientMode
与它所说的相差无几。该属性指定通信的哪一侧管理 sslsocket,check standard implementation .
SslSocket 服务器端的伪代码:
private ServerSocket createServerSocket(InetAddress localIp, int port) throws IOException {
ServerSocket sock;
Boolean dataProtection = (Boolean) ctx.getAttribute(FtpConstants.ATTR_DATA_PROT);
boolean ssl = dataProtection != null && dataProtection;
if (ssl) {
SSLServerSocketFactory factory = ctx.getOptions().getSslContext().getServerSocketFactory();
SSLServerSocket sslServerSocket = (SSLServerSocket) factory.createServerSocket(port, 1, localIp);
sslServerSocket.setUseClientMode(false);
enableCipherSuites(sslServerSocket);
sock = sslServerSocket;
} else {
sock = ServerSocketFactory.getDefault().createServerSocket(port, 1, localIp);
}
sock.setSoTimeout(DATA_CHANNEL_TIMEOUT);
return sock;
}
伪客户端:
public void test_UseClientMode() throws Exception {
SSLServerSocket sss = getSSLServerSocket();
sss.setUseClientMode(false);
assertFalse(sss.getUseClientMode());
sss.setUseClientMode(true);
assertTrue(sss.getUseClientMode());
}
所以最后你的握手错误告诉你在握手解析期间演员有错误的消息类型:
if (state >= type
&& (type != HandshakeMessage.ht_hello_request)) {
throw new SSLProtocolException(
"Handshake message sequence violation, " + type);
}
其中 ht_hello_request 是开始通信中出现的第一条消息,它是当前 actor 通信端的意外类型。
它确定这一方是否(a)发送或(b)期望收到初始握手消息,ClientHello
。如果 useClientMode
为真,则本方发送。除非您真的知道自己在做什么,否则不要将其设置在服务器上。如果你在一个服务器上并且你正在升级一个接受的 Socket
你 必须 将它设置为 false. 否则真的很几乎没有机会使用它。
注意 useClientMode=true
是默认值。
当我尝试将现有套接字连接升级为 SSLSocket 连接并设置 setUseClientMode(true)
时,调用 mySSLSocket.startHandshake();
时出现错误 javax.net.ssl.SSLProtocolException: Handshake message sequence violation, 1
。当不设置 setUseClientMode()
时一切正常,我可以发送和接收消息。我不是在要求修复,只是它的含义以及可能导致它的原因。
setUseClientMode
与它所说的相差无几。该属性指定通信的哪一侧管理 sslsocket,check standard implementation .
SslSocket 服务器端的伪代码:
private ServerSocket createServerSocket(InetAddress localIp, int port) throws IOException {
ServerSocket sock;
Boolean dataProtection = (Boolean) ctx.getAttribute(FtpConstants.ATTR_DATA_PROT);
boolean ssl = dataProtection != null && dataProtection;
if (ssl) {
SSLServerSocketFactory factory = ctx.getOptions().getSslContext().getServerSocketFactory();
SSLServerSocket sslServerSocket = (SSLServerSocket) factory.createServerSocket(port, 1, localIp);
sslServerSocket.setUseClientMode(false);
enableCipherSuites(sslServerSocket);
sock = sslServerSocket;
} else {
sock = ServerSocketFactory.getDefault().createServerSocket(port, 1, localIp);
}
sock.setSoTimeout(DATA_CHANNEL_TIMEOUT);
return sock;
}
伪客户端:
public void test_UseClientMode() throws Exception {
SSLServerSocket sss = getSSLServerSocket();
sss.setUseClientMode(false);
assertFalse(sss.getUseClientMode());
sss.setUseClientMode(true);
assertTrue(sss.getUseClientMode());
}
所以最后你的握手错误告诉你在握手解析期间演员有错误的消息类型:
if (state >= type
&& (type != HandshakeMessage.ht_hello_request)) {
throw new SSLProtocolException(
"Handshake message sequence violation, " + type);
}
其中 ht_hello_request 是开始通信中出现的第一条消息,它是当前 actor 通信端的意外类型。
它确定这一方是否(a)发送或(b)期望收到初始握手消息,ClientHello
。如果 useClientMode
为真,则本方发送。除非您真的知道自己在做什么,否则不要将其设置在服务器上。如果你在一个服务器上并且你正在升级一个接受的 Socket
你 必须 将它设置为 false. 否则真的很几乎没有机会使用它。
注意 useClientMode=true
是默认值。