【发布时间】:2018-01-19 22:29:40
【问题描述】:
亲爱的开发者你好,
我有以下问题:
几个月以来我一直在成功使用证书固定,使用 OkHTTP 3.6 和 Retrofit 1.9.0。
最近我将使用的 Retrofit 版本更新为 2.3.0,并开始使用 OkHttp 3.8。由于更新,证书固定不再适用于 AN 4.1 和 AN 6.0 之间的设备。
我尝试使用不同的 OkHTTP 版本,但没有成功。此外,我尝试通过 gradle 强制使用特定的 OkHTTP 版本,但这并没有改变任何东西。
这里是我们用于固定的代码:
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 不起作用意味着我能够拦截我的应用程序和后端服务器之间的连接 => 'Man in the middle'。
现在我完全不知道如何解决这个问题。 任何帮助表示赞赏。
干杯 帕斯卡
【问题讨论】:
-
请详细解释“证书固定不再起作用”是什么意思。
-
@CommonsWare 抱歉,我忘记了,现在添加。谢谢!
-
创建一个可重现的测试项目并向 OkHttp 人员提出问题,解释你是如何进行 MITM 攻击的(Charles 等),我猜。
标签: android retrofit2 okhttp3 certificate-pinning