无法将从字符串生成的证书添加到我的自定义 TrustManagers

Unable to add certificates generated form String to my custom TrustManagers

我正在尝试创建一个 TrustManagers 数组,其中填充了从 Base64 编码的 PEM 字符串解码的 CA 证书,以便在 SSLSocketFactory 中传递它。这是我的代码:

public static TrustManager[] getCustomTrustManagers(List<CertObject> certObjects)
{
    TrustManagerFactory tmf;
    try
    {
        tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());

        if (AndroidBuild.getSdkVersion() >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH)
        {
            KeyStore trustStore;
            try
            {
                trustStore = KeyStore.getInstance("BKS", "BC");
                trustStore.load (null, null);
                CertificateFactory cf = CertificateFactory.getInstance("X.509");
                for (CertObject certObject : certObjects)
                {
                    byte[] decoded = org.apache.commons.codec.binary.Base64.decodeBase64(certObject.getData().getBytes());
                    Certificate cert = cf.generateCertificate(new ByteArrayInputStream(decoded));
                    trustStore.setCertificateEntry(certObject.getName(), cert);
                }
            }
            catch (KeyStoreException | NoSuchAlgorithmException | IOException  e)
            {
                trustStore = null;
            }
            tmf.init(trustStore);
        }
        else
        {
            tmf.init((KeyStore) null);
        }
    }
    catch (NoSuchAlgorithmException | KeyStoreException e)
    {
        Log.e(TAG, e.getMessage);
    }

    return tmf.getTrustManagers();
}

证书生成成功,我看到了X509Certificate的有效实例,但是在

trustStore.setCertificateEntry(certObject.getName(), cert);

我有以下错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Object.hashCode()' on a null object reference
  at java.util.Collections.secondaryHash(Collections.java:3405)
  at java.util.Hashtable.get(Hashtable.java:265)
  at com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi.engineSetCertificateEntry(BcKeyStoreSpi.java:638)
  at java.security.KeyStore.setCertificateEntry(KeyStore.java:393)
  at com.xxx.app.core.Utils.getCustomTrustManagers(Utils.java:58)

有什么问题吗?我应该如何将证书添加到密钥库? certObject.getName()certObject.getData() 都是非空字符串。 certObject.getData() 包含使用 Base64 编码的 PEM 证书数据,没有 -----BEGIN CERTIFICATE----------END CERTIFICATE----- 行。

提前致谢!

尝试使用不同的别名,看起来 certObject.getName() 为空。

trustStore.setCertificateEntry("MyAlias", cert);

MyAlias 你必须用一些动态字符串替换。我只是举个例子。