Never mind. I figured it out by my own - add the following to the manifest.
<uses-permission android:name="android.permission.INTERNET" /> On Mar 11, 4:40 pm, telematics <[email protected]> wrote: > 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 [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -~----------~----~----~----~------~----~------~--~---

