I am new on SSL programming. The Android app I am developing needs to
open an SSL socket to a secure server which requires the client
authentication. When running on the Emulator and trying to talk to a
Server running on the host PC, the following Android code snippet
always gives me a SocketException at the line, SSLSocket c =
(SSLSocket) f.createSocket(hostName, 8888) :

    private void openSslClient(String hostName)
    {
        try
        {
            KeyStore keyStore = KeyStore.getInstance
(KeyStore.getDefaultType());
            InputStream fis = this.getAssets().open("client.bks");
            keyStore.load(fis, "clientjks".toCharArray());

            KeyManagerFactory kmf = KeyManagerFactory.getInstance
("X509");

            kmf.init(keyStore, "clientkey".toCharArray());

            TrustManagerFactory tmf = TrustManagerFactory.getInstance
("X509");

            tmf.init(keyStore);

            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(kmf.getKeyManagers(), tmf.getTrustManagers(),
                    new SecureRandom());

            SSLSocketFactory f = sc.getSocketFactory();
            SSLSocket c = (SSLSocket) f.createSocket(hostName, 8888);
            c.startHandshake();
            w = new BufferedWriter(new OutputStreamWriter
(c.getOutputStream()));
            r = new BufferedReader(new InputStreamReader
(c.getInputStream()));
        } catch (Exception e)
        {
            Log.e(LOG_TAG, "openSslClient failed", e);
        }
    }

The stack trace looks like below:
03-11 21:24:00.585: ERROR/OSNetworkSystem(1093): unknown socket error
-1
03-11 21:24:07.156: ERROR/PatientDataUploader(1093): openSslClient
failed
03-11 21:24:07.156: ERROR/PatientDataUploader(1093):
java.net.SocketException: unknown error
03-11 21:24:07.156: ERROR/PatientDataUploader(1093):     at
org.apache.harmony.luni.platform.OSNetworkSystem.createSocketImpl
(Native Method)
03-11 21:24:07.156: ERROR/PatientDataUploader(1093):     at
org.apache.harmony.luni.platform.OSNetworkSystem.createSocket
(OSNetworkSystem.java:79)
03-11 21:24:07.156: ERROR/PatientDataUploader(1093):     at
org.apache.harmony.luni.net.PlainSocketImpl2.create
(PlainSocketImpl2.java:59)
03-11 21:24:07.156: ERROR/PatientDataUploader(1093):     at
java.net.Socket.startupSocket(Socket.java:668)
03-11 21:24:07.156: ERROR/PatientDataUploader(1093):     at
java.net.Socket.<init>(Socket.java:142)
03-11 21:24:07.156: ERROR/PatientDataUploader(1093):     at
javax.net.ssl.SSLSocket.<init>(SSLSocket.java:42)
03-11 21:24:07.156: ERROR/PatientDataUploader(1093):     at
org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.<init>
(OpenSSLSocketImpl.java:179)
03-11 21:24:07.156: ERROR/PatientDataUploader(1093):     at
org.apache.harmony.xnet.provider.jsse.OpenSSLSocketFactoryImpl.createSocket
(OpenSSLSocketFactoryImpl.java:65)


The server test program I am using is a modified version of
SslReverseEchoer available on Dr. Herong Yang's website. It looks like
below:

        public static void main(String[] args) {
                if (args.length < 3) {
                        System.out.println("Usage:");
                        System.out
                                        .println("   java 
SslReverseEchoerRevised ksName ksPass ctPass
ipAddr");
                        return;
                }
                String ksName = args[0];
                char[] ksPass = args[1].toCharArray();
                char[] ctPass = args[2].toCharArray();
                String ipAddr = args[3];
                try {
                        KeyStore ks = KeyStore.getInstance("BKS");
                        ks.load(new FileInputStream(ksName), ksPass);
                        KeyManagerFactory kmf = 
KeyManagerFactory.getInstance("SunX509");
                        kmf.init(ks, ctPass);
                        TrustManagerFactory tmf = 
TrustManagerFactory.getInstance("X509");
                        tmf.init(ks);
                        SSLContext sc = SSLContext.getInstance("TLS");
                        sc.init(kmf.getKeyManagers(), tmf.getTrustManagers(), 
null);
                        SSLServerSocketFactory ssf = 
sc.getServerSocketFactory();
                        SSLServerSocket s = (SSLServerSocket) 
ssf.createServerSocket(8888,
                                        1, InetAddress.getByName(ipAddr));
                        s.setNeedClientAuth(true);
                        printServerSocketInfo(s);
                        SSLSocket c = (SSLSocket) s.accept();
                        printSocketInfo(c);
                        BufferedWriter w = new BufferedWriter(new 
OutputStreamWriter(c
                                        .getOutputStream()));
                        BufferedReader r = new BufferedReader(new 
InputStreamReader(c
                                        .getInputStream()));
                        String m = "Welcome to SSL Reverse Echo Server."
                                        + " Please type in some words.";
                        w.write(m, 0, m.length());
                        w.newLine();
                        w.flush();
                        while ((m = r.readLine()) != null) {
                                if (m.equals("."))
                                        break;
                                char[] a = m.toCharArray();
                                int n = a.length;
                                for (int i = 0; i < n / 2; i++) {
                                        char t = a[i];
                                        a[i] = a[n - 1 - i];
                                        a[n - i - 1] = t;
                                }
                                w.write(a, 0, n);
                                w.newLine();
                                w.flush();
                        }
                        w.close();
                        r.close();
                        c.close();
                        s.close();
                } catch (Exception e) {
                        System.err.println(e.toString());
                }
        }


Can someone shed some light on this?

Thank you in advance.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers-unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to