ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-11-02 08:26:08  阅读:208  来源: 互联网

标签:ssl sockets security java android


我正在尝试在我的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...

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

解决方法:

我认为您的问题类似于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.

所以你应该

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

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

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

编辑:您确定在服务器上使用SSLServerSocketFactory吗?看来您正在尝试同时将SSLSocketFactory用于客户端和服务器.那是行不通的.我搜索了this tutorial,基本上类似于您的代码.

标签:ssl,sockets,security,java,android
来源: https://codeday.me/bug/20191102/1990110.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有