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 -~----------~----~----~----~------~----~------~--~---