[英]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()。
关闭溪流。
关闭插座。
所以你应该
flush
。 最后,你应该关闭所有流。
在尝试在客户端读取响应之前先刷新并发送请求应该停止“挂起行为”。
编辑:您确定在服务器上使用SSLServerSocketFactory
吗? 看起来您正在尝试将SSLSocketFactory
用于客户端和服务器。 那不行。 我用Google搜索了这个教程 ,它基本上类似于你的代码应该是什么样子。
您可以尝试使用
org.apache.http.conn.ssl.SSLSocketFactory
类,特别是
此构造函数 。
编辑2017年3月26日:
忽略我上面写的内容,该类在Android上弃用Apache HTTP客户端时被弃用。 Android正在维护和增强标准的HttpURLConnection
和HttpsURLConnection
类。 有关完整说明,请参阅此处 。
不确定您的代码是否符合预期。 但行
inputStream = sslSocket.getInputStream();
基本上是期待来自套接字的服务器响应。 在大多数情况下,除非您首先请求某些内容(通过写入套接字输出流),否则请求响应将阻止套接字并等待。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.