Socket fromServer = new Socket("host", 443);
SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) factory.createSocket(fromServer, null, true);
sslsocket.setUseClientMode(true);
我试试,但得到" javax.net.ssl.SSLException:收到致命警报:internal_error"
如果我直接使用SSLSocket工作(factory.createSocket(" host",443);)
添加: 我需要在握手时添加自定义标头,以实现自定义协议
ADD2: 代码有效!我失败了,我在服务器上用SNI进行测试
答案 0 :(得分:3)
SSLSocket在TLS连接中传输数据。在传输数据之前需要建立TLS连接,即握手必须成功完成。因此,在握手完成之前写入SSLSocket是没有意义的,就像在TCP连接建立之前写入TCP套接字没有意义一样。
add:我需要在握手时添加自定义标头,以实现自定义协议
添加此信息后,问题更有意义。看起来您想先交换未加密的数据,然后再升级到TLS,例如在SMTP + STARTTLS中完成。在这种情况下,您需要首先建立正常的TCP连接,然后再将其升级到TLS。有关如何执行后一部分,请参阅Is it possible to change plain socket to SSLSocket?。