如何在握手前写入SSLSocket?

时间:2016-08-19 13:08:39

标签: java ssl networking https

    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进行测试

1 个答案:

答案 0 :(得分:3)

SSLSocket在TLS连接中传输数据。在传输数据之前需要建立TLS连接,即握手必须成功完成。因此,在握手完成之前写入SSLSocket是没有意义的,就像在TCP连接建立之前写入TCP套接字没有意义一样。

  

add:我需要在握手时添加自定义标头,以实现自定义协议

添加此信息后,问题更有意义。看起来您想先交换未加密的数据,然后再升级到TLS,例如在SMTP + STARTTLS中完成。在这种情况下,您需要首先建立正常的TCP连接,然后再将其升级到TLS。有关如何执行后一部分,请参阅Is it possible to change plain socket to SSLSocket?