在信任库中添加自定义证书

时间:2018-06-21 10:47:43

标签: android ssl android-security

我有一个要集成到android应用中的API。 API使用双向ssl握手。 我需要在我的应用程序TrustStore中添加服务器证书,并在Keystore中添加jks文件,以验证连接握手。

我在stackoverflow上进行了大量搜索,但对任何答案都不满意。

任何人都可以针对我的问题提供一些参考或解决方案。

编辑

我正在使用Http实现来建立连接。

public static SSLContext getSSLContext(Context context){

        try {

            CertificateFactory cf = CertificateFactory.getInstance("X.509");
            InputStream input_ca_main = new BufferedInputStream(context.getResources().openRawResource(R.raw.main));

            Certificate ca_main;

            ca_main = cf.generateCertificate(input_ca_main);

            System.out.println("ca=" + ((X509Certificate) ca_main).getSubjectDN());

            String keyStoreType = KeyStore.getDefaultType();
            KeyStore keyStore = KeyStore.getInstance(keyStoreType);
            keyStore.load(null, null);
            keyStore.setCertificateEntry("ca_main", ca_main);

            String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
            TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
            tmf.init(keyStore);

            SSLContext sslcontext = SSLContext.getInstance("TLS");
            sslcontext.init(null, tmf.getTrustManagers(), null);
            return sslcontext;

        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }

这就是我用来在请求中包含证书的内容。但是在阅读了双向SSL的概念后,我发现服务器证书必须位于我们的信任库中。

1 个答案:

答案 0 :(得分:0)

如果您正在寻找要添加到设备中受信任证书中的服务器证书。恐怕您必须使用信任库来遵循在其他示例中看到的内容。

如果您正在寻找一种向请求中添加证书的方法,请尝试以下代码(假设您使用的是volley):

KeyStore keyStore = KeyStore.getInstance("PKCS12"); // this will be your certificate files extension.
            keyStore.load(
                    new ByteArrayInputStream(Base64Helper.decodeIntoByteArray(YOUR_CERTIFICATE_HERE),
                   YOUR_CERT_PASSWORD_HERE);

            KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
            keyManagerFactory.init(keyStore, YOUR_CERT_PASSWORD);

            SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(keyManagerFactory.getKeyManagers(), null, null);
            HurlStack hurlStack = new HurlStack(null, sslContext.getSocketFactory());
            requestQueue = Volley.newRequestQueue(EMISMobileApplication.getInstance().getAppContext(), hurlStack);

然后使用此请求队列连接回服务器。