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

Add custom certificate in trust store

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

我在 Whosebug 上搜索了很多,但对任何答案都不满意。

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

编辑

我正在使用 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的概念后,我发现服务器证书必须在我们的truststore中。

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

如果您正在寻找将证书添加到您的请求的方法,请尝试以下代码(假设您使用 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);

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