【问题标题】:How to use Onionkit with Volley如何在 Volley 中使用 Onionkit
【发布时间】:2014-11-06 17:29:34
【问题描述】:

我正在开发的应用程序使用 Onionkit 进行 TSL/SSL 证书验证。我在应用程序中添加了 Volley 支持,但意识到 Volley 只支持 Apache HttpClient,而 Onionkit 使用的是 boye.androidlib HttpClient。所以这两个不能一起工作。 现在我在这里https://github.com/kulik/volley.git 使用Volley 的fork,它与boye 库一起使用,所以我的应用程序正在运行。

但是我宁愿只使用 Volley。有没有办法让它工作?我查看了 HurlStack 类,它有 SSLSocketFactory 字段。我想这个可以用于证书验证。但我还没有想出让它工作的方法。很抱歉这种含糊的问题,但我不是安全专家。使用 Onikit 时,我将证书引脚传递给了 TrustManager。但是我还没有找到将 SSLFactory 与 TrustManager 链接的方法。任何帮助将不胜感激。

谢谢 雷

【问题讨论】:

  • 我建议按正方形切换到改造库。它为您处理 TTL/SSL 连接,而无需定义信任管理器等。
  • 我可以在不设置信任管理器的情况下使用 ssl 连接,但这无法阻止中间人攻击。

标签: android ssl-certificate android-volley verification onionkit


【解决方案1】:

您可以使用 HurlStack 来使用不同的 HttpClient 实现。例如,见how to use OkHttp with Volley:

public class OkHttpStack extends HurlStack {
  private final OkHttpClient client;

  public OkHttpStack() {
    this(new OkHttpClient());
  }

  public OkHttpStack(OkHttpClient client) {
    if (client == null) {
      throw new NullPointerException("Client must not be null.");
    }
    this.client = client;
  }

  @Override protected HttpURLConnection createConnection(URL url) throws IOException {
    return client.open(url);
  }   
}

并与它一起使用

Volley.newRequestQueue(context, new OkHttpStack())

应该很容易从中得出如何使用您的 http 客户端。如果你想使用自己的 SSL 逻辑,你可以从 HurlStack 覆盖这个方法

private static SSLSocketFactory createPinnedSSLCertFactory(Context ctx) {
    //create your implementation 
}

我真的不知道你到底想在这里做什么,但这是一个加载空密钥库并将其固定到仅 1 个证书的示例(不接受任何其他证书 -> ssl 固定)

private static SSLSocketFactory createPinnedSSLCertFactory(Context ctx) {
    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    Certificate myCert = //read certificate in;
    String keyStoreType = KeyStore.getDefaultType();
    KeyStore keyStore = KeyStore.getInstance(keyStoreType);
    keyStore.load(null, null); //inputstream null creates new keystore
    keyStore.setCertificateEntry("mycert", myCert );

    String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
    tmf.init(keyStore);

    SSLContext context = SSLContext.getInstance("TLS");
    context.init(null, tmf.getTrustManagers(), null);

    return context.getSocketFactory();
}

注意:我在使用 Gingerbread (2.3) 创建自己的 SSLFactory 时遇到了问题,更低意味着它不起作用。

【讨论】:

  • 这看起来很有希望,谢谢。我之前没有注意到 createConnection 。会检查出来。至于你关于我想做什么的问题。我在想只使用 HUrlConnection 而不使用 HttpClient。对我来说最重要的是做证书固定。目前我有几个不同证书的别针。我自己没有证书。使用 SSLSocketFactory 如何做到这一点?谢谢
  • 你不能固定你没有的证书(这就是重点:),但你可以很容易地下载它们,例如你的浏览器。此外,我已经提出了如何固定证书的示例,您可以从那里扩展它。
  • OKHttpStack 似乎无法正常工作。我的http客户端是ch.boye.httpclientandroidlib.impl.client.DefaultHttpClient,它不是从URL类派生的,所以不被createConnection方法接受。
  • 好吧,我认为你运气不好,坚持使用 fork,因为似乎没有简单的方法来插入你的 http 客户端。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 2017-03-19
  • 2021-09-13
  • 2019-07-09
相关资源
最近更新 更多