Нет системного TLS на Android после использования Bouncy Castle

#android #okhttp #bouncycastle

#Android #okhttp #bouncycastle

Вопрос:

Я использую поставщика безопасности Bouncy Castle для шифрования / дешифрования. Я также обязательно удаляю поставщика BC после каждого вызова Bouncy castle. Вот код 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 Client и т.д.), Но все равно получаю ту же ошибку.
Я даже добавил официальную библиотеку Android conscypt в проект и установил Conscrypt в качестве 1-го поставщика следующим образом:

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

без какой-либо удачи.

Любая идея будет приветствоваться!

ПРИМЕЧАНИЕ: Когда я использую URL.openConnection до BC / на основе pubVerifySign, все идет просто отлично!

Комментарии:

1. Существуют ли альтернативы, которые не требуют подобной регистрации? например, Tink?

2. Добавление поставщика Bouncycastle следует выполнять только тогда, когда вы знаете, что вам это нужно, но если вы добавите его, нет особых причин удалять его, если, опять же, вы не знаете , что его необходимо удалить из-за какой-либо ошибки или несовместимости.

Ответ №1:

У BouncyCastle есть два провайдера, вам, вероятно, потребуется удалить оба.

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

Если поставщик JSSE остается, он завершится неудачей, когда не найдет ожидаемое хранилище ключей.

Комментарии:

1. Я отмечу ваш пост как правильный ответ. Однако вчера, сразу после публикации вопроса, я обнаружил, что если я «повторно добавлю» BouncyCastleProvider в подсистему безопасности, все будет работать нормально. Хотя, это НЕ то, что я ожидал. Я добавил, а затем удалил поставщика BC (для целей шифрования) и ожидал, что подсистема вернется к поставщику по умолчанию. Android ЭТОГО НЕ сделал.