【问题标题】:No System TLS on Android after using Bouncy Castle使用 Bouncy Castle 后,Android 上没有系统 TLS
【发布时间】:2020-09-17 11:43:54
【问题描述】:

我正在使用 Bouncy Castle Security Provider 进行加密/解密。 我还确保在每次 Bouncy castle 通话后删除 BC 提供程序。 这是 BC 代码:

public static boolean pubVerifySign(
        String pKey, String sSignature, String sChallenge) throws UnsupportedEncodingException{
    BouncyCastleProvider bcp = initSecuritySubsystem();
    
    boolean bOutput = false;
    try{
        ECPublicKey ecPublicKey = 
                getPublicKeyForBytes(Hex.decode(pKey));
    
        bOutput =
                pubVerifySign(ecPublicKey, 
                        sSignature, sChallenge);
    }finally{
        Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);
    }
    return bOutput;
}

但是,就在代码之后。 但是,每当我尝试使用 URL.openConnection 或任何其他 Http 库时, 我收到以下错误:没有系统 TLS:

cz.msebera.android.httpclient.ssl.SSLInitializationException: java.security.KeyStoreException: java.security.NoSuchAlgorithmException: KeyStore BKS implementation not found
at cz.msebera.android.httpclient.ssl.SSLContexts.createDefault(SSLContexts.java:57)
at cz.msebera.android.httpclient.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:978)
at cz.msebera.android.httpclient.impl.client.HttpClients.createDefault(HttpClients.java:56)
at org.nebucoin.user.utils.URLUtils.getHttp(URLUtils.java:63)Caused by: java.security.KeyManagementException: java.security.KeyStoreException:       java.security.NoSuchAlgorithmException: KeyStore BKS implementation not found
at org.conscrypt.SSLParametersImpl.createDefaultX509KeyManager(SSLParametersImpl.java:534)
at org.conscrypt.SSLParametersImpl.getDefaultX509KeyManager(SSLParametersImpl.java:515)
at org.conscrypt.SSLParametersImpl.<init>(SSLParametersImpl.java:126)
at org.conscrypt.OpenSSLContextImpl.engineInit(OpenSSLContextImpl.java:104)
at javax.net.ssl.SSLContext.init(SSLContext.java:349)
at cz.msebera.android.httpclient.ssl.SSLContexts.createDefault(SSLContexts.java:52)

我尝试了无数其他 Http Android 库(OkHTTP、Apache HTTP 客户端等),仍然遇到同样的错误。 我什至在项目中添加了 conscypt 官方 Android 库,并将 Conscrypt 设置为 1st Provider,如下所示:

Security.insertProviderAt(Conscrypt.newProvider(), 1);

运气不好。

欢迎任何想法!

注意:当我在 BC/基于 pubVerifySign 之前使用 URL.openConnection 时,一切正常!

【问题讨论】:

  • 有没有像这样不需要注册的替代品?例如叮当?
  • 添加 Bouncycastle 提供程序只应在您知道需要它时完成,但如果您确实添加它,则没有太多理由删除它,除非您再次知道由于一些错误或不兼容,它需要被删除。

标签: android okhttp bouncycastle


【解决方案1】:

BouncyCastle 有两个提供程序,您可能需要同时删除它们。

    Security.insertProviderAt(BouncyCastleProvider(), 1)
    Security.insertProviderAt(BouncyCastleJsseProvider(), 2)

如果 JSSE 提供程序仍然存在,那么当它找不到所需的密钥库时它将失败。

【讨论】:

  • 我会将您的帖子标记为正确答案。不过,我昨天发现,就在发布问题后,如果我将 BouncyCastleProvider “重新添加”到安全子系统,一切正常。虽然,这不是我所期望的。我确实添加然后删除了 BC 提供程序(出于加密目的),并希望子系统恢复为默认提供程序。 Android 没有。
猜你喜欢
  • 1970-01-01
  • 2023-02-09
  • 2012-03-19
  • 2021-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多