繁体   English   中英

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

[英]How to create a secure SSL connection between Android client and Java server?

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

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

         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...

所以仍然没有运气,没有超时,没有例外,只是等待那里......

我认为你的问题与类似。 SSL套接字连接的工作流程相同:

但是,基础知识与此计划中的基本内容大致相同:

打开一个插座。

打开输入流并将输出流输出到套接字。

根据服务器的协议读取和写入流,在完成消息后调用流上的flush()。

关闭溪流。

关闭插座。

所以你应该

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

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

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


编辑:您确定在服务器上使用SSLServerSocketFactory吗? 看起来您正在尝试将SSLSocketFactory用于客户端服务器。 那不行。 我用Google搜索了这个教程 ,它基本上类似于你的代码应该是什么样子。

您可以尝试使用 org.apache.http.conn.ssl.SSLSocketFactory类,特别是 此构造函数

编辑2017年3月26日:

忽略我上面写的内容,该类在Android上弃用Apache HTTP客户端时被弃用。 Android正在维护和增强标准的HttpURLConnectionHttpsURLConnection类。 有关完整说明,请参阅此处

不确定您的代码是否符合预期。 但行


    inputStream =  sslSocket.getInputStream();  

基本上是期待来自套接字的服务器响应。 在大多数情况下,除非您首先请求某些内容(通过写入套接字输出流),否则请求响应将阻止套接字并等待。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM