最近,我一直在测试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
只有第一个哈希值发生了变化,我自然会假设与站点的通信应该停止工作,因为我们的实现现在有一个不正确的哈希值,但事实并非如此,因为其他三个与以前相同。
创建新证书时是我的错误吗?这是正确的行为还是错误?有没有办法检查链中的所有哈希是否正确?