这是我测试过的场景和内容:
我正在移动应用程序(颤振应用程序)中进行证书固定以固定我们后端域的证书。
证书验证通过并成功建立连接:
- 我固定有效的叶子证书和中间证书。
- 我只固定有效的叶子证书
- 我只固定有效的中间证书
- 我固定无效的叶子证书但有效的中间证书
验证并因此连接失败时:
- 我只固定无效的叶子证书。
- 我只固定无效的中间证书。
- 我固定无效的叶子证书和无效的中间证书。
根据上述行为,我得出以下结论:
- 每当服务器发送其叶子证书时,首先检查它是否存在于固定证书集中。如果这个确切的叶子证书没有被固定,那么这个叶子证书没有被验证,因此它会查看谁签署了这个证书,这给了它中间证书。
- 它再次检查此中间证书是否在固定证书集中。如果我们固定了相同的中间证书,那么它被认为是经过验证的,并且由于服务器证书是由经过验证的中间证书颁发的,所以连接将成功。
- 因此,固定同一域的中间证书和叶证书(任何父证书和后代证书)是没有意义的,因为即使所有后代证书都未通过验证,也会考虑链中最顶层的证书。
在以下情况下,我如何再进行一次连接失败的测试:
我固定有效的叶子证书但无效(不同的)中间证书。
所以我之前的结论是首先检查叶子证书似乎是错误的,或者我在这里遗漏了一些东西。
这好像是 :
- 链中的证书在固定的证书集中进行检查,从链中最顶部的证书到最底部(从根证书到叶证书)
我的结论正确吗?我在这里想念什么?是否从叶子检查证书,并且只有在验证失败时,它才会查看链上的其他证书?还是完全是别的东西?