运行simpleSSL客户端时出现“java.net.SocketException:Connection reset”

时间:2016-05-03 13:20:48

标签: java ssl rabbitmq

我正在尝试使用SSL通信创建客户端/服务器。我按照此处列出的说明(https://www.rabbitmq.com/ssl.html)。

我受到了这个错误的欢迎:

运行服务器时

java.net.SocketException: Connection reset
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
    at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
    at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
    at java.io.DataOutputStream.flush(DataOutputStream.java:123)
    at com.rabbitmq.client.impl.SocketFrameHandler.sendHeader(SocketFrameHandler.java:129)
    at com.rabbitmq.client.impl.SocketFrameHandler.sendHeader(SocketFrameHandler.java:134)
    at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:277)
    at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:678)
    at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:722)

使用客户端时:

Exception in thread "main" java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at sun.security.ssl.InputRecord.readFully(Unknown Source)
    at sun.security.ssl.InputRecord.read(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.waitForClose(Unknown Source)
    at sun.security.ssl.HandshakeOutStream.flush(Unknown Source)
    at sun.security.ssl.Handshaker.kickstart(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.kickstartHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.writeRecord(Unknown Source)
    at sun.security.ssl.AppOutputStream.write(Unknown Source)
    at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
    at java.io.BufferedOutputStream.flush(Unknown Source)
    at java.io.DataOutputStream.flush(Unknown Source)
    at com.rabbitmq.client.impl.SocketFrameHandler.sendHeader(SocketFrameHandler.java:129)
    at com.rabbitmq.client.impl.SocketFrameHandler.sendHeader(SocketFrameHandler.java:134)
    at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:277)
    at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:678)
    at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:722)
    at rmqClient.simpleSSL.main(simpleSSL.java:23)

这是我的rabbit.config文件:

[
    {ssl, [{versions, ['tlsv1.2', 'tlsv1.1']}]},
    {
    rabbit,
    [
          {ssl_listeners, [5675]},
      {ssl_options, [{cacertfile,"sslConn/ca_certificate.pem"},
                          {certfile,  "sslConn/server_certificate.pem"},
                          {keyfile,   "sslConn/server_key.pem"},
                          {versions, ['tlsv1.2', 'tlsv1.1']},
                          {ciphers,  [{ecdhe_ecdsa,aes_128_cbc,sha256},
                                      {ecdhe_ecdsa,aes_256_cbc,sha}]}
                         ]},     
          {tcp_listeners, [5672]},
          {loopback_users, []}
        ]
    }
].

这里也是我的客户代码:

    factory.setHost("10.3.9.139");
    factory.setPort(5673);
    factory.setUsername("User1");
    factory.setPassword("User1");
    factory.useSslProtocol();
    Connection conn = factory.newConnection();
    Channel channel = conn.createChannel();
    channel.queueDeclare("rabbitmq-java-test", false, true, true, null);
    channel.basicPublish("", "rabbitmq-java-test", null, "Hello, World".getBytes());

3 个答案:

答案 0 :(得分:4)

java.net.SocketException: Connection reset通常是由远程对等关闭连接引起的。

我猜你的SSL配置不适合服务器。 这里的建议是调试SSL连接以找到根本原因。

尝试将此系统属性附加到JVM参数:

-Djavax.net.debug=all

更多详情here

答案 1 :(得分:0)

在v配置中,您为SSL侦听器设置了端口5675,但在代码中您使用的是5673。

答案 2 :(得分:0)

我能够通过指定以下内容在Java 1.7中修复此问题:   SSLContext sc = SSLContext.getInstance(" TLSv1.2");