1

最近,我一直在测试OkHttp提供的证书固定实现,使用版本 4.9.0 + Retrofit 2.9.0;而且我注意到哈希检查不是合取的,而是析取的。

根据示例实现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

如果我们更改证书并且我们使用与以前相同的提供者和/或 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

1 回答 1

1

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

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

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

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

于 2021-02-04T05:45:18.453 回答