【问题标题】:SSL connection failure between java server and android clientjava服务器和android客户端之间的SSL连接失败
【发布时间】:2012-04-05 18:21:30
【问题描述】:

我正在尝试在 java 主机和 android 客户端之间设置相互身份验证 SSL 连接。不知道为什么连不上。下面是Android客户端应用程序和Java服务器的代码。

客户端代码:

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());
        }
    }
};

服务器代码:

    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();
    }

我在服务器上遇到“没有通用密码套件”错误。因为我在 SSL 连接设置中无处可去。如果您发现错误或重大问题,请让我帮忙。

这里是link 我跟随创建证书和信任库。我创建的 Truststore 和 kestore 是 here

我使用的是 Android 2.2 和 BKSProvider 1.46,请告诉我哪里出错了。我必须尽快结束这个项目。

提前致谢。

【问题讨论】:

  • 定义“未连接”。相反会发生什么?堆栈跟踪?
  • 重复的原因是我的帖子没有得到答复。这是一种没人能回答的问题吗?除非我得到回答,否则永远不会放弃尝试并再次提出这个问题。
  • 这不是在这里重复帖子的可接受原因。
  • @EJP,我现在面临的问题与以前不同。这些帖子的内容相同,但问题不同。因此,我将尝试修改当前帖子以描述我当前的问题,抱歉打扰了。下次会小心的。但我担心,帖子会被忽略,可能不会得到任何回应。

标签: java android ssl


【解决方案1】:

从堆栈跟踪看来,您捕获的异常不包含消息。

Log.d(TAG, e.getMessage());

与 SSL 无关。

【讨论】:

  • 是的!你是对的。摆脱了 NULL 异常。但事实是 SSL 连接还没有工作。
  • ahanin,你帮我摆脱了那个 NULL 异常兄弟。谢谢你的建议。但是我仍然迷失在java服务器和android客户端之间建立连接。
  • @iCan,请添加堆栈跟踪,以便人们可以帮助您。
  • 我已经解决了这个问题,但现在面临另一个问题,它与 java 主机上的“No cipher suites in common”和 android 客户端上的“SSLHandshake failure”有关。我需要再次发布问题还是应该继续在这篇文章中?
  • 因为我正在处理自签名证书,所以在 java 主机和 android 客户端之间建立 ssl 连接真的很痛苦。已在此 link 之后创建了证书,但代码已修改位。任何信息如何克服“没有共同的密码套件”错误?
【解决方案2】:

解决了!问题出在 java 主机的信任库上,随后是 this 帖子。

需要为客户端/服务器指定trustStore,因为它们使用默认的trustStore,导致失败。在服务器上使用 -Djavax.net.ssl.trustStore=servertruststore.jks -Djavax.net.ssl.trustStorePassword=server 并在客户端创建自己的密钥库和信任库允许会话完成。是 -Djavax.net.debug=ssl,handshake 帮助很大。

整个命令是:java -Djavax.net.ssl.keyStore=server.jks -Djavax.net.ssl.keyStorePassword=server -Djavax.net.ssl.trustStore=servertruststore.jks -Djavax.net.ssl。 trustStorePassword=服务器 SSLServer

现在我开始创建 sslsession 和多线程编程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 2020-06-20
    • 2021-02-07
    • 2018-01-06
    • 2011-11-05
    • 2016-09-15
    • 1970-01-01
    相关资源
    最近更新 更多