Announcement Announcement Module
Collapse
No announcement yet.
Android SSL Client Authentication certificate: SSL handshake terminated: ssl=0x182c70 Page Title Module
Move Remove Collapse
X
Conversation Detail Module
Collapse
  • Filter
  • Time
  • Show
Clear All
new posts

  • Android SSL Client Authentication certificate: SSL handshake terminated: ssl=0x182c70

    I'm developing an android application on v13 target sdk and I'm trying to secure connection from android device to my tomcat server v6 with SSL enabling also clientAuth. I'm using self-signed certificates.

    Only for introduce my project (I think the error is not due to this): I'm using spring-android RestTemplate using a custom ClientHttpRequestFactory. Because of android sdk version I'm sure that spring will use HttpUrlConnection and not HttpClient! So I'm extending SimpleclientHttpRequestFactory and overriding the openConnectionMethod. I need to do this to trust my self-signed certificates and to use my client authentication certificate!

    So I init my sslContext and set to HttpURLConnection in this way:
    Code:
    private SSLSocketFactory getSSLSocketFactory() throws KeyStoreException, KeyManagementException, NoSuchAlgorithmException, CertificateException, IOException, UnrecoverableKeyException{
        final InputStream trustStoreLocation = mContext.getResources().openRawResource(R.raw.trust_store); 
        final String trustStorePassword = "........";
    
        final InputStream keyStoreLocation = mContext.getResources().openRawResource(R.raw.key_store); 
        final String keyStorePassword = "........";
    
        final KeyStore trustStore = KeyStore.getInstance("BKS");
        trustStore.load(trustStoreLocation, trustStorePassword.toCharArray());
    
        final KeyStore keyStore = KeyStore.getInstance("BKS");
        keyStore.load(keyStoreLocation, keyStorePassword.toCharArray());
    
        final TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(trustStore);
    
        final KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        kmf.init(keyStore, keyStorePassword.toCharArray());
    
        final SSLContext sslCtx = SSLContext.getInstance("TLS");
        sslCtx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), new SecureRandom());
    
        return sslCtx.getSocketFactory();
    }
    
    @Override
    protected HttpURLConnection openConnection(URL url, Proxy proxy) throws IOException {
        final HttpURLConnection httpUrlConnection = super.openConnection(url, proxy);
        if (url.getProtocol().toLowerCase().equals("https")) {
            try {
                ((HttpsURLConnection)httpUrlConnection).setSSLSocketFactory(getSSLSocketFactory());
                ((HttpsURLConnection)httpUrlConnection).setHostnameVerifier(new NullHostnameVerifier());
            } catch (Exception e) {
                if (LogConfig.ERROR_LOGS_ENABLED){
                    Log.e(LOG_TAG, e.getMessage());
            }
    
        } 
        return httpUrlConnection;
    }
    
    private static class NullHostnameVerifier implements HostnameVerifier {
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    }
    When tomcat clientAuth is disabled it works fine.

    But when tomcat client authentication is enabled, trying to establish connection from android device I got this exception:

    Code:
    error:140943F2:SSL routines:SSL3_READ_BYTES:sslv3 alert unexpected message (external/openssl/ssl/s3_pkt.c:1232 0x19bf40:0x00000003); nested exception is javax.net.ssl.SSLProtocolException: SSL handshake terminated: ssl=0x182c70: Failure in SSL library, usually a protocol error
    I've tryed to install the client certificate on my web browser for testing purpose and everything goes ok! So I think it's a problem of my android application!

    Have you ever got this kind of exception?
Working...
X