10

我的项目使用Android Volley网络框架很久了,最近发现网上发布了一个SSL 3.0协议的bug。

我想知道如何才能知道我的项目使用的 TLS 版本是什么,以及如何确认库是否已更新。

这是我的源代码片段:

HttpStack stack = new HurlStack();
Network network = new BasicNetwork(stack);
mHttpRequestQueue = new RequestQueue(new NoCache(), network);
mHttpRequestQueue.start();

我认为重点在于 HurlStack 类,它取决于org.apache.http包,但我不知道 TLS/SSL 配置在哪里。

4

3 回答 3

20

您可以通过创建自定义 HTTPStack 并在Volley.javaVolley.newRequestQueue(context, httpStack)的方法中设置堆栈来修改 Volley 中使用的 TLS 版本。虽然,您只需要为 Android 版本 16-19 执行此操作。在 v16 之前,不支持 TLS 1.2,在 v19 之后,默认启用 TLS 1.2。因此,您应该专注于为 Android 版本 16-19 手动将 TLS 设置为 1.2。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN
    && Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
    try {
      ProviderInstaller.installIfNeeded(getContext());
    } catch (GooglePlayServicesRepairableException e) {
      // Indicates that Google Play services is out of date, disabled, etc.
      // Prompt the user to install/update/enable Google Play services.
      GooglePlayServicesUtil.showErrorNotification(e.getConnectionStatusCode(), getContext());
      // Notify the SyncManager that a soft error occurred.
      syncResult.stats.numIOExceptions++;
      return;
    } catch (GooglePlayServicesNotAvailableException e) {
      // Indicates a non-recoverable error; the ProviderInstaller is not able
      // to install an up-to-date Provider.
      // Notify the SyncManager that a hard error occurred.
      syncResult.stats.numAuthExceptions++;
      return;
    }

    HttpStack stack = null;
    try {
      stack = new HurlStack(null, new TLSSocketFactory());
    } catch (KeyManagementException e) {
      e.printStackTrace();
      Log.d("Your Wrapper Class", "Could not create new stack for TLS v1.2");
      stack = new HurlStack();
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
      Log.d("Your Wrapper Class", "Could not create new stack for TLS v1.2");
      stack = new HurlStack();
    }
    requestQueue = Volley.newRequestQueue(context, stack);
} else {
  requestQueue = Volley.newRequestQueue(context);
}

然后使用扩展 SSLSocketFactory 的 TLSSocketFactory 类,就像 Florian Krauthan 在此处创建的那样,其中启用了 v1.2 TLS 协议:https ://gist.github.com/fkrauthan/ac8624466a4dee4fd02f#file-tlssocketfactory-java

于 2015-11-23T15:00:06.877 回答
1

在 Android 上,使用的 TLS 版本主要取决于使用的 Android 版本。Apache Volley 基于基于 HttpsUrlConnection 的 Apache Http Client,因此使用标准的 SSL/TLS SSLSocketFactory。

在低于 4.3 的 Android 上,通常只支持 SSLv3 和 TLS 1.0。在更高版本中,通常支持但禁用 TLS 1.1 和 1.2。

从 Android 5 开始,默认支持并启用TLS 1.1 和 TLS 1.2

于 2015-07-08T08:05:05.720 回答
0

@w3bshark 的回答对我有用。但使用该代码之前,请确保包含更新Security Provider的代码。就我而言,在我更新安全提供程序之前,TLS 不起作用。以下是更新它的代码。

private void updateAndroidSecurityProvider() {
    try {
        ProviderInstaller.installIfNeeded(this);
    } catch (GooglePlayServicesRepairableException e) {
        Log.e("Test321", "PlayServices not installed");
    } catch (GooglePlayServicesNotAvailableException e) {
        Log.e("Test321", "Google Play Services not available.");
    }
}
于 2017-10-10T11:51:17.237 回答