[英]SSL connection failure between java server and android client
I am trying to setup mutual authentication SSL connection between java host and android client.我正在尝试在 java 主机和 android 客户端之间设置相互身份验证 SSL 连接。 Don't know why its not getting connected.
不知道为什么它没有连接。 Below are the code of Android client app and Java server.
以下是 Android 客户端应用程序和 Java 服务器的代码。
Client code:客户端代码:
private SSLContext createSSLContext(final Context cont){
SSLContext ssl_cont = null;
try {
Log.d(TAG, "TrustStore - Initializing");
KeyStore trustStore = KeyStore.getInstance("BKS");
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
InputStream trustStoreStream = cont.getResources().openRawResource(R.raw.myclienttruststore);
trustStore.load(trustStoreStream, "client".toCharArray());
trustManagerFactory.init(trustStore);
Log.d(TAG, "TrustStore - Initialized");
// Setup keystore
Log.d(TAG, "KeyStore - Initializing");
KeyStore keyStore = KeyStore.getInstance("BKS");
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
InputStream keyStoreStream = cont.getResources().openRawResource(R.raw.myclient);
keyStore.load(keyStoreStream, "client".toCharArray());
keyManagerFactory.init(keyStore, "client".toCharArray());
Log.d(TAG, "KeyStore - Initialized");
ssl_cont = SSLContext.getInstance("TLS");
ssl_cont.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);
} catch (Exception e) {
// TODO Auto-generated catch block
alertbox("SSLClient", "ERROR: " + e.getMessage());
Log.d(TAG, "ERROR: " + e.getMessage());
}
return ssl_cont;
}
OnClickListener onConnClick = new OnClickListener() {
public void onClick(View arg0) {
// TODO Auto-generated method stub
try {
// Setup the SSL context to use the truststore and keystore
Log.d(TAG, "Started..");
SSLContext ssl_context = createSSLContext(cont);
Log.d(TAG,"here 1...");
SSLSocketFactory socketFactory = (SSLSocketFactory) ssl_context.getSocketFactory();
Log.d(TAG,"here 2...");
socket = (SSLSocket) socketFactory.createSocket(ipadd.getText().toString().trim(), Integer.parseInt(port.getText().toString().trim()));
Log.d(TAG,"here 3...");
dataOut = new DataOutputStream(socket.getOutputStream());
dataIn = new DataInputStream(socket.getInputStream());
dataOut.writeUTF("Hello !!");
msgin.setText("Connected");
Log.d(TAG, "Completed..");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
msgin.setText("Not connected");
alertbox("Main", "ERROR: " + e.getMessage());
Log.d(TAG, "ERROR: " + e.getMessage());
}
}
};
Server code:服务器代码:
try {
mySSLServerFac = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
mySSLServerSocket = (SSLServerSocket) mySSLServerFac.createServerSocket(9999);
System.out.println("Listening on 9999\n");
mySSLSocket = (SSLSocket) mySSLServerSocket.accept();
DataInputStream input = new DataInputStream(mySSLSocket.getInputStream());
DataOutputStream output = new DataOutputStream(mySSLSocket.getOutputStream());
do{
System.out.println("Remote IP Address : " + mySSLSocket.getInetAddress());
msg = input.readUTF().toString();
System.out.println(msg);
java.util.Scanner sc = new java.util.Scanner(System.in);
output.writeUTF(sc.nextLine());
}while(msg != "exit");
System.out.println(msg);
} catch (Exception e) {
e.printStackTrace();
}
I am stuck with "No cipher suites in common" error at server.我在服务器上遇到“没有共同的密码套件”错误。 Since i am nowhere in SSL connection setup.
因为我在 SSL 连接设置中无处可去。 Let me help if you find out the bug or major problem.
如果您发现错误或主要问题,请让我帮忙。
Here is the link i followed to create certificate and truststore.这是我用来创建证书和信任库的链接。 Truststore and kestore i have created are here
我创建的 Truststore 和 kestore 在这里
I am using Android 2.2 and BKSProvider 1.46, please let know where i am going wrong.我正在使用 Android 2.2 和 BKSProvider 1.46,请告诉我哪里出错了。 I have to wind up this project as soon as possible.
我必须尽快结束这个项目。
Thanks in advance.提前致谢。
From the stack trace it looks like exception you caught does not contain a message.从堆栈跟踪来看,您捕获的异常似乎不包含消息。
Log.d(TAG, e.getMessage());
It has nothing to do with SSL.与SSL无关。
It's solved, Problem was with the truststore of java host, followed this post.解决了,问题出在 java 主机的信任库上,关注了这篇文章。
The trustStore needs to be specified for client/server as they are using the default trustStore, causing failure.需要为客户端/服务器指定 trustStore,因为它们使用默认的 trustStore,导致失败。 Using -Djavax.net.ssl.trustStore=servertruststore.jks -Djavax.net.ssl.trustStorePassword=server on the server and creating own keystore & truststore at client allows the session to complete.
在服务器上使用 -Djavax.net.ssl.trustStore=servertruststore.jks -Djavax.net.ssl.trustStorePassword=server 并在客户端创建自己的密钥库和信任库允许 session 完成。 It was the -Djavax.net.debug=ssl,handshake which helped lot.
这是 -Djavax.net.debug=ssl,handshake 帮助很大。
The entire command is: java -Djavax.net.ssl.keyStore=server.jks -Djavax.net.ssl.keyStorePassword=server -Djavax.net.ssl.trustStore=servertruststore.jks -Djavax.net.ssl.trustStorePassword=server SSLServer整个命令是:java -Djavax.net.ssl.keyStore=server.jks -Djavax.net.ssl.keyStorePassword=server -Djavax.net.ssl.trustStore=servertruststore.jks-Djavax9.net3783Patruststoreserver28.873 SSL服务器
Now i am on to creating sslsession and multi-threaded programming.现在我要创建 sslsession 和多线程编程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.