Android - 使用 Retrofit 2.3 和 OkHTTP 固定证书

标签 android retrofit2 okhttp certificate-pinning

您好亲爱的开发者,

我有以下问题:

几个月以来,我通过 OkHTTP 3.6 和 Retrofit 1.9.0 成功地使用了证书固定。

最近我将使用的 Retrofit 版本更新为 2.3.0,并开始使用 OkHttp 3.8。由于更新,证书固定不再适用于 AN 4.1 和 AN 6.0 之间的设备。

我尝试使用不同的 OkHTTP 版本,但没有成功。此外,我尝试通过 gradle 强制使用特定的 OkHTTP 版本,但这并没有改变任何东西。

这里是我们用于 Pinning 的代码:

public CertificatePinner provideCertificatePinner(@PinForDomain(DEUTSCHE_POST) final PinnedDomain deutschePost, @PinForDomain(NOVOMIND) final PinnedDomain novomindPin, @PinForDomain(EMMI) final PinnedDomain emmiPin) {
    Log.d(LOG_TAG, "Creating CertificatePinner");
    final CertificatePinner.Builder builder = new CertificatePinner.Builder();
    builder.add("www.url.com", "sha256Key");
    return builder.build();
}

public OkHttpClient provideOkHttpClient(CertificatePinner pinner) {

    Log.d(LOG_TAG, "Creating OkHttpClient");
    final OkHttpClient.Builder clientBuilder = new OkHttpClient().newBuilder();
    clientBuilder.certificatePinner(provideCertificatePinner);
    clientBuilder.connectTimeout(BuildConfig.CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS);
    clientBuilder.writeTimeout(BuildConfig.WRITE_TIMEOUT, TimeUnit.MILLISECONDS);
    clientBuilder.readTimeout(BuildConfig.CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS);
    return clientBuilder.build();
}

所以我尝试了以下操作:

强制使用 TLS v1.2

ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)  
.tlsVersions(TlsVersion.TLS_1_2)
.cipherSuites(
      CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
      CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
      CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256)
.build();

OkHttpClient client = new OkHttpClient.Builder() 
    .connectionSpecs(Collections.singletonList(spec))
    .build();

并实现自定义 SSLSocketFactory,强制在 AN 4.1 下的版本中使用 TLS v1.2,根据::https://github.com/square/okhttp/issues/2372

编辑:

澄清一下。 Pining 不工作意味着我能够拦截我的应用程序和后端服务器之间的连接 =>“中间人”。

现在我完全不知道如何解决这个问题。 感谢您的帮助。

干杯 帕斯卡

最佳答案

我发现问题不是由 OKHTTP/Retrofit 引起的,而是由客户端的错误配置引起的。作为那个项目的新手,我对这一切一无所知。

抱歉打扰了,感谢您的帮助

关于Android - 使用 Retrofit 2.3 和 OkHTTP 固定证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45634622/

相关文章:

android - 为什么改造响应为字段提供空值,而响应可以获取对象?

android - 改造不会在断点处停止

android - actionNext & textMultiline 不工作

android动态壁纸重新缩放

android - 在装有Android 5.x.x的每台三星设备上错误放大类ImageView

java - Retrofit 2 : response. body()为空,但状态码为200

android - 从 Android 应用程序在 Django 中保存图像

java - Okhttp3 与 conscrypt 在 jdk 8 中支持 http 2

java - OkHttp,Android - 下载 html 页面并在 View 中显示此内容

android - 带字母表索引的 RecyclerView