简体   繁体   English

SSL java服务器与android客户端连接失败

[英]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.

相关问题 如何在Android客户端和Java服务器之间创建安全的SSL连接? - How to create a secure SSL connection between Android client and Java server? 客户端/服务器Java之间ssl连接中的握手失败 - handshake failure in ssl connection bewteen client/server java PHP客户端和Java服务器之间的SSL套接字连接 - SSL socket connection between PHP client and Java server 关于Java SSL客户端与服务器连接的问题 - Question about Java SSL connection between client and server 如何在Android客户端和自定义Java服务器之间使用SSL套接字 - How to use SSL socket between android client and custom java server 无法在Java服务器和Android客户端之间建立连接 - Unable to establish a connection between a java server and an android client 在Android appEDIT中建立Java服务器和客户端之间的连接 - Establishing a connection between Java server and client within Android appEDIT 从amqp客户端到Rabbitmq服务器的Java 8 SSL握手失败 - Java 8 SSL handshake failure from amqp client to rabbitmq server Java SSL:客户端握手失败和服务器没有共同的密码套件 - Java SSL: client handshake failure and server no cipher suites in common 服务器 - Android应用程序和服务器之间的客户端连接 - Server - Client connection between android app and a server
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM