使用 OKHTTP3 证书固定进行改造

Posted

技术标签:

【中文标题】使用 OKHTTP3 证书固定进行改造【英文标题】:Retrofit with OKHTTP3 certification pinning 【发布时间】:2017-04-29 16:15:49 【问题描述】:

我正在使用带有 OKHTTP3 客户端的 Retrofit 1.9,并且我正在尝试添加认证固定。下面是相关代码:

String hostname = "xxxxxx.xx";

CertificatePinner certificatePinner = new CertificatePinner.Builder()
    .add(hostname, "sha1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=")
    .build();

OkHttpClient client = new OkHttpClient.Builder()
     .certificatePinner(certificatePinner)
     .build();

return new RestAdapter.Builder()
     .setRequestInterceptor(request -> 
         request.addHeader("CONTENT-TYPE", "application/json");
     )
     .setEndpoint("https://xxxxxxxxxxxx").
     .setClient(new Ok3Client(client))
     .build();

不幸的是,它似乎不起作用。我没有

"javax.net.ssl.SSLPeerUnverifiedException: Certificate pinning failure!"

异常,甚至我的主机或 SHA 都不正确。谁能解释一下为什么?

【问题讨论】:

@lensniak 你能告诉我你是怎么得到别针的吗(“sha1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=”) 我从发送查询的端点(服务器)获得了证书(sha1)。 但他们(服务器)只提供证书 您可以从证书中读取证书指纹(sha1、sha256...)。工具:samltool.com/fingerprint.php 或 knowledge.symantec.com/support/identity-protection-support/… 【参考方案1】:

有几件事情需要检查,因为你已经编辑了这些部分,所以错误很常见,我不能确定这些是否是你的问题,但是这两个错误都会导致没有固定的没有日志。

1) 对于CertificatePinner 中的hostname,请确保它只是主机名,例如“www.example.com”,而不是网址“https://www.example.com”。 2) 对于.setEndpoint("xxxxxxxxxxxx"),确保您的端点是httpshttp 上没有检查任何证书,所以没有日志。

【讨论】:

以上是关于使用 OKHTTP3 证书固定进行改造的主要内容,如果未能解决你的问题,请参考以下文章

OkHttp3基本认证(Basic Authentication)

okhttp3.0忽略https证书

okhttp3.0忽略https证书

Retrofit2 OkHttp3 响应正文空错误

使用 OkHttp java 进行远程服务器可用性检查

Android实战——okhttp3的使用和封装