【问题标题】:Export certificate authority from PKCS12 on Android从 Android 上的 PKCS12 导出证书颁发机构
【发布时间】:2018-02-15 19:34:18
【问题描述】:

我正在尝试建立从我的应用到内部服务器的 SSL 连接。我下载了一个 PKCS12 文件,其中包含所有需要的证书和 CA。然后我将它加载到我用来进行 SSL 调用的密钥库中。

当我进行 SSL 调用时,我收到以下异常: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

查看android dev website,看起来这是由于未知的证书颁发机构造成的。

到目前为止,这是我的代码:

private void testConnect(String base64Pkcs) {
    KeyStore keyStore;
    SSLContext sslContext = null;
    TrustManager trustManager = null;
    try {
        keyStore = KeyStore.getInstance("PKCS12");
        writeFile(base64Pkcs);
        if (keyStore != null) {
            keyStore.load(readFile(), DEBUG_CERT_PWD.toCharArray());

            KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            keyManagerFactory.init(keyStore, DEBUG_CERT_PWD.toCharArray());
            KeyManager[] keyManagers = keyManagerFactory.getKeyManagers();

            sslContext = SSLContext.getInstance("TLS");
            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("X509");
            trustManagerFactory.init(keyStore);
            sslContext.init(keyManagers, trustManagerFactory.getTrustManagers(), null);
            trustManager = trustManagerFactory.getTrustManagers()[0];

            OkHttpClient client = new OkHttpClient.Builder()
                    .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustManager)
                    .build();

            final Request request = new Request.Builder().url(getApplication().getString(R.string.https_test_endpoint_url)).build();

            client.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    Log.e(TAG, "Error while calling the test secure endpoint", e);
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    Log.d(TAG, response.message());
                    if (response.body() != null) {
                        Log.d(TAG, response.body().string());
                    }
                }
            });
        }
    } catch (KeyStoreException | IOException | NoSuchAlgorithmException | CertificateException | UnrecoverableKeyException | KeyManagementException e) {
        //TODO: Handle exceptions
        Log.wtf(TAG, e);
    }
}

我可以通过使用 openSSL 从 PKCS12 文件中手动提取 CA 来使连接正常工作,将其放入我的应用程序资产中,然后使用以下方法加载它:

openssl pkcs12 -in tls.pkcs -cacerts -nokeys -chain -out tls.trust - password pass:mydevpassword`
keyStore.setCertificateEntry("ca", myCaCert);` 

我的问题是我无法从我的应用程序中使用 openSSL 来导出 CA 并将其以编程方式加载到密钥库。有没有办法做到这一点,还是我不得不在应用资产中包含 CA?

【问题讨论】:

  • 将同一个文件用作密钥库和信任库是没有意义的。 KeyManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()) 当然应该是 KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm())
  • 好收获!我修好了...

标签: java android keystore pkcs#12 boringssl


【解决方案1】:

是你没有在manifest中设置networkSecurityConfig的问题吗?

https://stackoverflow.com/a/60102517/114265

【讨论】:

    猜你喜欢
    • 2014-12-26
    • 2012-04-18
    • 2018-06-19
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    相关资源
    最近更新 更多