当前位置: 首页 > 知识库问答 >
问题:

我如何告诉TLS版本在Android Volley

景永望
2023-03-14

我的项目使用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配置在哪里。

共有3个答案

赵景曜
2023-03-14

@w3bshark的回答对我很有用。但在使用该代码之前,请确保包含更新安全提供程序的代码。在我的例子中,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.");
    }
}
严正初
2023-03-14

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

在低于4.3的Android上,通常只支持SSLv3和TLS1.0。在更高版本上,TLS 1.1和1.2通常受支持,但被禁用。

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

丌官运珧
2023-03-14

您可以通过创建自定义HTTPStack并在Volley中设置堆栈来修改Volley中使用的TLS版本。newRequestQueue(context,httpStack)方法。JAVA尽管如此,您只需要为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);
}

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

 类似资料:
  • 场景: 我有一个使用Gradle构建的应用程序 应用程序使用JavaFX 我想要的 null 将指向所需的JDK 我可以接受很多建议: 定义系统环境变量的解决方案,我可以在build.gradle脚本中签入该变量 在gradle.properties中定义的变量 仅针对构建上下文重写JAVA_HOME变量(类似于) 我没有想过的其他事情 问题: 如何将变量(如何定义,如中的变量、系统环境变量、..

  • 我想在这里对蒂姆的回答发表评论(https://stackoverflow.com/a/1172805/1746310)但因为我的声誉,我不能,我写了它作为回答,说我想发表评论,但因为我的声誉,我不能。这条消息后来被ChrisF删除了(https://stackoverflow.com/users/59303/chrisf)说这不是答案,我应该写一条评论。。。我找不到这个词。 不管怎样,这就是我所

  • 问题内容: 例如,下面的脚本从顶部开始: 另外请记住,应该能够停止脚本。 问题答案: 将其放入while循环中。我还建议您添加一个“睡眠”,这样就不会使计算机的CPU达到最快的速度:

  • 问题内容: 我不知道该如何工作。 场景: 我有一个用gradle构建的应用程序 该应用程序使用JavaFX 我想要的是 使用一个变量(针对每个开发人员的机器定义),该变量指向JDK的安装,该安装将用于构建整个应用程序/测试/ … 我考虑过要文件,定义变量。就像是 我不想要的 指向JAVA_HOME所需的JDK 我可以接受很多建议: 定义系统环境变量的解决方案,我可以在脚本中检查 中定义的变量 仅针

  • 问题内容: 如何在HttpClient上更改受支持的TLS版本? 我正在做: 但是当我检查创建的套接字时,它仍然说支持的协议是TLSv1.0,TLSv1.1和TLSv1.2。 实际上,我只希望它针对此特定HttpClient停止使用TLSv1.2。 问题答案: 解决方案是: 不过,这需要org.apache.httpcomponents.httpclient4.3.x。

  • 问题内容: 在Maven中,依赖关系通常是这样设置的: 现在,如果你正在使用发布频繁的库,则不断更新标记可能会有些烦人。有什么方法可以告诉始终使用最新的可用版本(来自存储库)? 问题答案: 有关更多详细信息,请参见Maven书籍的POM语法部分。或者在Dependency Version Ranges上查看此文档,其中: 方括号([&])表示“封闭”(含)。 括号((&))表示“开放”(排除)。