作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在装有 Android 6.0 的 AVD 上使用
。我正在尝试使用由根 CA 签名的自签名证书来实现公钥固定。该根 CA 位于系统 CA 信任库中。 com.squareup.retrofit2:retrofit:2.0.1
和 com.squareup.okhttp3:okhttp:3.2.0
使用okhttp wiki提供的例子有一些小的变化:
OkHttpClient client = new OkHttpClient.Builder().certificatePinner(
new CertificatePinner.Builder()
.add(pinningUrl, "sha256/invalidPIN")
.build()).build();
Request request = new Request.Builder()
.url(pinningUrl)
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
for (Certificate certificate : response.handshake().peerCertificates()) {
System.out.println(CertificatePinner.pin(certificate));
}
发生的是 response.isSuccessful 返回 true,没有抛出异常,尽管 pin 不正确。唯一正确完成的是使用系统 CA 信任库中的根 CA 验证证书。
我发现有效的方法是在 for 循环之前添加这一行。但这不是正确的方法,因为请求已经发送,固定应该在 TLS 协商完成之前起作用。此外,我发现的任何示例代码中都没有提到这一行。
client.certificatePinner().check(pinningUrl, response.handshake().peerCertificates());
抛出
javax.net.ssl.SSLPeerUnverifiedException: Certificate pinning failure!
是okhttp提供的示例代码有bug还是我哪里做错了?
最佳答案
您配置不正确。将 pinningUrl
替换为固定 URL 的主机名。例如,您需要 example.com
而不是 http://example.com/
。如果您想发送 PR 以使主机名验证更严格,我们将非常欢迎。
关于android - okhttp 无法正确验证引脚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36874379/
我是一名优秀的程序员,十分优秀!