java - 如何在 Android 客户端和 Java 服务器之间创建安全的 SSL 连接?

标签 java android security sockets ssl

我正在尝试在我的 android 客户端和 java 服务器之间创建一个安全的 TCP/IP 连接。到目前为止,密码学不是我的强项。我知道我必须使用 Bouncy CaSTLe keystore ,但我被卡住了。

我需要创建一个可用于服务器和客户端的自签名证书。这就是我被困的地方。

         InputStream clientTruststoreIs = getResources().openRawResource(R.raw.bks);
         KeyStore trustStore = null;
         trustStore = KeyStore.getInstance("BKS");
         trustStore.load(clientTruststoreIs, "123456".toCharArray());
        InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
        SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();

        sslSocket = (SSLSocket) sslsocketfactory.createSocket(serverAddr, 2222);
        inputStream =  sslSocket.getInputStream();  
        Log.d("TEST", "\n1 input");

它连接正常,它显示了服务器端的连接,但是 inputStream = sslSocket.getInputStream() 行完全锁定/不返回。我不确定我是否正确设置了任何充气城堡,或者服务器是否正确设置。请帮忙,我无能为力....

编辑: 我修改了服务器,使其在连接时发送数据,但仍然没有发送数据,我更改了获取输入和输出流的顺序,然后它锁定了我获取输出流的位置:

        sslSocket = (SSLSocket) sslsocketfactory.createSocket(serverAddr, 9999);
        outputStream = sslSocket.getOutputStream();
        Log.d("test", "--**--- created socket 2.0 outputsreams"); // does not reach here
        outputStreamWriter = new OutputStreamWriter(outputStream);
        bufferedWriter = new  BufferedWriter(outputStreamWriter);         
        inputStream =  sslSocket.getInputStream();  
        inputStreamReader = new InputStreamReader(inputStream);
        bufferedReader = new BufferedReader(inputStreamReader);
        ...
        String line = bufferedReader.readLine(); // where I'd expect it to lock...

所以仍然没有运气,没有超时,没有异常(exception),它只是在那里等待......

最佳答案

我认为你的问题类似于this .相同的工作流程适用于 SSL 套接字连接:

However, the basics are much the same as they are in this program:

Open a socket.

Open an input stream and output stream to the socket.

Read from and write to the stream according to the server's protocol, call flush() on the stream when you are done with a message.

Close the streams.

Close the socket.

所以你应该

  1. 首先通过从客户端写入服务器的 OutputStream 向您的服务器发送请求,完成后刷新
  2. 然后服务器将通过其 InputStream 接收消息,并可以作为返回写入其 OutputStream,完成后再次刷新。
  3. 使用 InputStream 从客户端读取响应,从 1 开始,直到完成。

最后,您应该关闭所有流。

在客户端尝试读取响应之前先刷新并发送请求应该会停止“挂起行为”。


编辑:您确定在服务器上使用了 SSLServerSocketFactory 吗?看起来您正在尝试对客户端 服务器使用 SSLSocketFactory。那是行不通的。我用谷歌搜索了 this tutorial ,这基本上类似于您的代码应该是什么样子。

关于java - 如何在 Android 客户端和 Java 服务器之间创建安全的 SSL 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7219758/

相关文章:

java - 什么是 NullPointerException,我该如何解决?

java - JTable 中的页脚行

java - 为什么我的Pascal的三角形Java代码不起作用?

java - asin() 函数有问题

java - 弹力城堡 DefaultSignatureAlgorithmIdentifierFinder NoSuchFieldError : gostR3410_94

java - Windows XP 上 java 的逻辑字体 Monospaced 的 TrueType 字体是什么

Android如何从xml中识别音频/视频?

java - 连接 BassBoost 时 MediaPlayer 不播放 - 错误 (-22, 0)

security - 如何限制Firebase数据修改?

web-services - RESTful Web 服务的最终用户身份验证