HTTPS connection with client certificate in an android app

后端 未结 5 1285
無奈伤痛
無奈伤痛 2020-12-13 09:28

I am trying to replace the currently working HTTP connection with a HTTPS connection in a Android app that I am writing. The additional security of a HTTPS connection is nec

5条回答
  •  渐次进展
    2020-12-13 09:58

    I'm posting an updated answer since people still reference and vote on this question. I have had to change the socket factory code a few times as some things have changed since Android 4.0

    // Trust manager / truststore
    KeyStore trustStore=KeyStore.getInstance(KeyStore.getDefaultType());
    
    // If we're on an OS version prior to Ice Cream Sandwich (4.0) then use the standard way to get the system
    //   trustStore -- System.getProperty() else we need to use the special name to get the trustStore KeyStore
    //   instance as they changed their trustStore implementation.
    if (Build.VERSION.RELEASE.compareTo("4.0") < 0) {
        TrustManagerFactory trustManagerFactory=TrustManagerFactory
            .getInstance(TrustManagerFactory.getDefaultAlgorithm());
        FileInputStream trustStoreStream=new FileInputStream(System.getProperty("javax.net.ssl.trustStore"));
        trustStore.load(trustStoreStream, null);
        trustManagerFactory.init(trustStore);
        trustStoreStream.close();
    } else {
        trustStore=KeyStore.getInstance("AndroidCAStore");
    }
    
    InputStream certificateStream=new FileInputStream(userCertFile);
    KeyStore keyStore=KeyStore.getInstance("PKCS12");
    try {
        keyStore.load(certificateStream, certPass.toCharArray());
        Enumeration aliases=keyStore.aliases();
        while (aliases.hasMoreElements()) {
            String alias=aliases.nextElement();
            if (keyStore.getCertificate(alias).getType().equals("X.509")) {
                X509Certificate cert=(X509Certificate)keyStore.getCertificate(alias);
                if (new Date().after(cert.getNotAfter())) {
                    // This certificate has expired
                    return;
                }
            }
        }
    } catch (IOException ioe) {
        // This occurs when there is an incorrect password for the certificate
        return;
    } finally {
        certificateStream.close();
    }
    
    KeyManagerFactory keyManagerFactory=KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
    keyManagerFactory.init(keyStore, certPass.toCharArray());
    
    socketFactory=new SSLSocketFactory(keyStore, certPass, trustStore);
    

    Hopefully this helps anyone still coming here in the future.

提交回复
热议问题