Ssl 在TLS期间强制Chrome发送链中的所有证书

Ssl 在TLS期间强制Chrome发送链中的所有证书,ssl,certificate,ssl-certificate,ocsp,Ssl,Certificate,Ssl Certificate,Ocsp,我已经编写了一个TLS代码,它在Java上进行相互身份验证,所以客户端在服务器发送证书之后发送证书。我想通过OCSP验证证书链中的所有证书,OCSP是从客户端到服务器端的 我编写了循环逻辑,假设最后一个证书是链中的根(CA)证书,不发送任何OCSP查询 int certificateChainSize= x509Certificates.length; // Verifies certificate chain respectively (issuer cert

我已经编写了一个TLS代码,它在Java上进行相互身份验证,所以客户端在服务器发送证书之后发送证书。我想通过OCSP验证证书链中的所有证书,OCSP是从客户端到服务器端的

我编写了循环逻辑,假设最后一个证书是链中的根(CA)证书,不发送任何OCSP查询

        int certificateChainSize= x509Certificates.length;

        // Verifies certificate chain respectively (issuer certificate required).
        CertificateResult response = null;

        try {
            for (int i = 0; i < certificateChainSize-1 ; i++) {
                response = client.verify(x509Certificates[i], x509Certificates[i+1]);
            }
        } catch (OcspException e) {
            e.printStackTrace();
        }
int-certificateChainSize=x509Certificates.length;
//分别验证证书链(需要颁发者证书)。
CertificateResult响应=null;
试一试{
对于(int i=0;i
当我测试TLS并获取Wireshark捕获时,我意识到作为客户端的Google Chrome一直在发送没有根的证书链。因此由于循环逻辑,不会查询中间证书,因为我的代码假定intermedite证书是根证书

如何强制客户端发送证书链的所有节点

谢谢

我意识到Google Chrome作为客户端一直在发送没有根的证书链

这是完全正常的,也是唯一正确的行为

根证书是信任锚,它必须是验证证书的一方的本地。即使它是发送的,在验证证书时也应该忽略它,即只使用本地信任锚——否则中间人只能提供自己的证书链,包括自己的根证书。这意味着在这种情况下,服务器必须已经在本地拥有根证书,因此客户端不需要发送它

换句话说:不要试图改变Chrome的行为,而是调整你对正确行为的期望(和你的代码)

我意识到Google Chrome作为客户端一直在发送没有根的证书链

这是完全正常的,也是唯一正确的行为

根证书是信任锚,它必须是验证证书的一方的本地。即使它是发送的,在验证证书时也应该忽略它,即只使用本地信任锚——否则中间人只能提供自己的证书链,包括自己的根证书。这意味着在这种情况下,服务器必须已经在本地拥有根证书,因此客户端不需要发送它


换句话说:不要试图改变Chrome的行为方式,而是调整您对正确行为的期望(以及您的代码)。

我同意Steffen的观点,但要给出更多的事实,这里有明确的说明:

证书列表:证书索引结构的序列(链), 每个都包含一个证书和一组扩展名

发件人的证书必须放在第一位 请在列表中尝试。下列证书应 直接证明其前一项。因为 证书验证要求分发信任锚 独立地,指定信任锚的证书可以是 从链中省略,前提是已知受支持的对等点 拥有任何遗漏的证书

最后,关于订购:

注:在TLS 1.3之前,每次订购都需要“证书清单” 证明紧跟在其前面的人的证书;然而 一些实现允许一些灵活性。服务器有时 发送当前和不推荐的中间版本以进行过渡 目的和其他目的只是配置不正确,但是 尽管如此,案例仍然可以得到适当的验证。最多 兼容性,所有实现都应准备好处理 来自任何 TLS版本,但最终实体证书除外 必须是第一位


所以Chrome正确地应用了这个规范。你需要改变你的目的来应对它。

我同意Steffen的观点,但要给出更多的事实,这里有明确的说法:

证书列表:证书索引结构的序列(链), 每个都包含一个证书和一组扩展名

发件人的证书必须放在第一位 请在列表中尝试。下列证书应 直接证明其前一项。因为 证书验证要求分发信任锚 独立地,指定信任锚的证书可以是 从链中省略,前提是已知受支持的对等点 拥有任何遗漏的证书

最后,关于订购:

注:在TLS 1.3之前,每次订购都需要“证书清单” 证明紧跟在其前面的人的证书;然而 一些实现允许一些灵活性。服务器有时 发送当前和不推荐的中间版本以进行过渡 目的和其他目的只是配置不正确,但是 尽管如此,案例仍然可以得到适当的验证。最多 兼容性,所有实现都应准备好处理 来自任何 TLS版本,但最终实体证书除外 必须是第一位


所以Chrome正确地应用了这个规范。您需要更改您的终端以应对此问题。

那么,我如何发送OCSP查询以获取中间证书?AFAIK OCSP请求包含散列的颁发者名称和密钥,但我们没有根的密钥作为i