OkHttp 证书固定错误或默认行为?

问题描述

最近,我一直在使用版本 4.9.0 + Retrofit 2.9.0 测试 certificate pinning 提供的 OkHttp 实现;而且我注意到哈希检查不是连接的而是分离的。

根据示例实现publicobject.com的证书链:

Peer certificate chain:
    sha256/afwiKY3RxoMmLkuRW1l7QsPZTJPwDS2pdDROQjXw8ig=: CN=publicobject.com,OU=PositiveSSL
    sha256/klO23nT2ehFDXCfx3eHTDRESMz3asj1muO+4aIdjiuY=: CN=COMODO RSA Secure Server CA
    sha256/grX4Ta9HpZx6tSHkmCrvpApTQGo67CYDnvprLg5yRME=: CN=COMODO RSA Certification Authority
    sha256/lCppFqbkrlJ3EcVFAkeip0+44VaoJUymbnOaEUk7tEU=: CN=AddTrust External CA Root

如果我们更改证书并使用与以前相同的提供程序和/或根,我们会得到如下结果:

Peer certificate chain:
    sha256/dklfnskvAAQFvandjfjASAFjvjvg45nbwskdvur5548=: CN=publicobject.com,OU=PositiveSSL
    sha256/klO23nT2ehFDXCfx3eHTDRESMz3asj1muO+4aIdjiuY=: CN=COMODO RSA Secure Server CA
    sha256/grX4Ta9HpZx6tSHkmCrvpApTQGo67CYDnvprLg5yRME=: CN=COMODO RSA Certification Authority
    sha256/lCppFqbkrlJ3EcVFAkeip0+44VaoJUymbnOaEUk7tEU=: CN=AddTrust External CA Root

只有第一个哈希值发生变化,我自然会假设与站点的通信应该停止工作,因为我们的实现现在有一个不正确的哈希值,但事实并非如此,因为其他三个与以前相同。

是我创建新证书时的错误吗? 这是正确的行为还是错误? 有没有办法检查链中的所有哈希值是否正确?

解决方法

那个特定的握手涉及 4 个证书,如果任何与您的签名之一匹配,OkHttp 会很高兴。

这意味着您可以在以下任一操作事件中幸存下来:

  • 更改您的证书颁发机构(您的组织公钥保持不变)
  • 丢失公钥并将其切换出去(CA 保持不变)

但是,如果您更改了证书颁发机构并获得了新的公钥,则在您更新其 pin 之前,客户端将无法连接。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...