Java SSLSocket问题

时间:2017-07-06 18:55:28

标签: java sockets ssl networking sslsocketfactory

我目前正在从事客户服务器项目 我出于安全原因决定使用SSL。

我尝试将所有message = getGraph(); // = some_useless_string[[-955, 0.13325974],[-880, 0.23449805],[-795, 0.24322645],[-720, -0.008947457]] values = message.replace("some_useless_string", ""); Socket对象转换为其SSL版本,但无济于事。
当我使用ServerSocket并连接到它时,服务器端的套接字输出在SSLServerSocket的中间冻结。

以下是我用来创建SSL套接字的函数, outputstream.write(byte[])ContextController.CONTEXTSSLContext是我切换SSL的快捷方式:

Constants.DEBUG

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(); } (即SSL关闭)时,它可以工作,但是当SSL打开时,它会在无限期地发送一些数据之后冻结,如上所述。我该如何解决这个问题?

修改
以下是Constants.DEBUG = true的来源:
(注意,我知道我应该使用实际的ContextController.CONTEXT,但首先我想要这个工作)

TrustManager

编辑2
这是一个冻结的堆栈跟踪,注意它没有崩溃,它挂起:

    if (server) {// load the keystore
        try (FileInputStream fis = new FileInputStream(ks)) {
            CONTEXT = SSLContext.getInstance("SSL");

            // load the keystore from the file
            KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
            keystore.load(fis, PASSWORD);

            // setup the KeyManagerFactory (used by the server)
            KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
            kmf.init(keystore, PASSWORD);

            CONTEXT.init(kmf.getKeyManagers(), null, null);
        }
        catch (Exception e) {
        }
    }
    else {
        CONTEXT = SSLContext.getInstance("SSL");
        CONTEXT.init(null, new TrustManager[] { new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] chain, String authType) {
            }

            @Override
            public void checkServerTrusted(X509Certificate[] chain, String authType) {
            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        } }, null);
    }

我在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 之后放置了一个断点,它从未到达它。

1 个答案:

答案 0 :(得分:-1)

我真的不知道为什么会这样,我不需要SSL的所有方面(只有加密部分,这就是为什么我没有实现TrustManager)所以我决定实施一个Diffie Hellman。

这可以按预期工作,并将DH与AES结合使用我根据自己的要求加密了流量。

谢谢大家的帮助!