部分客户端访问IIS服务器时,证书链中的中级证书过期怎么办?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了部分客户端访问IIS服务器时,证书链中的中级证书过期怎么办?相关的知识,希望对你有一定的参考价值。

这种情况通常发生在IIS服务器上。导致该问题的原因是服务器上存在多张可提供信任关系的中级证书,且其中有已过期的中间级证书。
如果客户端PC系统中证书存储区没有新的中级证书而只有已经过期版本的中级证书的话,客户端浏览器不会主动从服务器上下载新的中级证书文件,而只通过已过期的中级证书去验证服务器证书的有效性。导致客户端报中间级证书已过期错误。
解决方法:删除服务器上计算机账户中“中级证书颁发机构”里已过期的证书,并更新最新的中级证书文件,强制客户端下载最新的证书链文件,使客户端只能通过一条最新的证书链来验证服
参考技术A 这种情况通常发生在IIS服务器上。导致该问题的原因是服务器上存在多张可提供信任关系的中级证书,且其中有已过期的中间级证书。解决方法:删除服务器上计算机账户中“中级证书颁发机构”里已过期的证书,并更新最新的中级证书文件,强制客户端下载最新的证书链文件,使客户端只能通过一条最新的证书链来验证服务器证书的有效性。如果以上无法解决你的困惑,建议咨询天威诚信等专业的CA机构。

OCSP查询没有颁发者证书的中间证书

我编写了一个TLS代码,它在Java上进行相互身份验证,因此客户端在服务器发送证书后发送证书。我想验证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();
    }

当我测试TLS并获得Wireshark捕获时,我意识到Google Chrome作为客户端一直在发送没有root的证书链。结果是;由于循环逻辑,因此我的代码假定中间证书是root,因此不会查询中间证书。我需要颁发者证书来验证链中的任何证书。是否有没有颁发者证书的机制验证(以防:根证书)。

答案

我认为,你的设计存在缺陷。

当您没有根证书时,不需要针对OCSP服务器验证证书,因为该链是不可信的,并且OCSP验证没有意义。

在主要的加密库中,撤销检查作为构建所有可能的证书链的最后一步发生,选择最佳链并且根据各种验证规则成功验证(其中大多数在§6 of RFC 5280 中描述)。只有当所有检查都成功时,客户端才会尝试对链中的每个证书进行吊销检查。成功的链构建和验证将暗示您已经拥有受信任的根证书,因为有效链构建为根证书。

另外,正如你在之前的帖子Force Chrome to send all certificates in chain during TLS中所说:

为了获得最大的兼容性,所有实现都应该准备好处理来自任何TLS版本的潜在无关证书和任意排序,但必须首先是最终实体证书。

该声明暗示随后的i+1证书可能不是当前i证书的发行者所必需的。结果,这一行:

response = client.verify(x509Certificates[i], x509Certificates[i+1]);

将返回意外的结果,因为它的输入是错误的。

你真正应该做的是:让操作系统加密库(作为操作系统的一部分提供)来完成最艰苦的工作。我强烈建议不要发明自己的加密并使用经过验证的工具。每个操作系统都有API,可以构建,安排和验证证书链,并为您提供最好的证书链。您应该使用此链作为OCSP验证代码的输入,并且您的for循环将被视为可靠(取决于verify方法的内部逻辑)。

就像我说的,如果链构建过程失败,没有太多理由进行OCSP验证。

以上是关于部分客户端访问IIS服务器时,证书链中的中级证书过期怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

Openssl:错误“证书链中的自签名证书”

Openssl:错误“证书链中的自签名证书”

nodejs - 证书链中的错误自签名证书

SSL证书问题:证书链中的自签名证书