【问题标题】:is an expired ssl certificate validated similar to an invalid certificate in SSL pinning?过期的 ssl 证书是否与 SSL pinning 中的无效证书类似?
【发布时间】:2020-06-06 13:07:27
【问题描述】:

我有根证书、中间证书和叶子证书。

如果我将所有这些证书固定在我的移动应用程序中,那么假设leaf 证书已过期。

但是连接仍然会被接受,因为中间证书和根证书已经被固定了。

如果有人发送的不是我过期的叶证书但由相同的中间证书或根证书签名的不同证书怎么办?

由于根证书和中间证书在这个不同的证书中也相同,连接是否仍然建立?

【问题讨论】:

    标签: ssl https ssl-certificate tls1.2


    【解决方案1】:

    使用的固定有多种类型:

    • 可以固定在叶子证书上。这意味着只接受此证书。这也可以选择性地与额外检查过期、撤销等相结合,在这种情况下,只有当证书是预期的并且它也符合额外的约束(过期......)时,才会接受证书。
    • 可以锁定叶证书的公钥。这就像固定叶证书本身,但只要公钥保持不变,它也会处理证书更新。同样,这可以选择与检查过期等结合使用。
    • 可以针对特定的 CA 证书进行锁定。在这种情况下,将完成正常的证书验证(即构建信任路径、检查主题、到期......),但另外还需要特定的 CA 或具有相同公钥的证书是信任链的一部分,或者作为中间证书或根证书。

    如果我将所有这些证书固定在我的移动应用程序中,那么假设叶证书已过期。
    但是连接仍然会被接受,因为中间证书和根证书已经固定。

    如果已完成对叶证书的固定,则仅当固定中没有其他约束(特别是检查过期)时,它才会接受过期的证书。

    如果有人发送了一个不同的证书,不是我过期的叶子证书,但它是由相同的中间证书或根证书签名的?

    如果针对特定叶证书进行了锁定,则无论是否针对 CA 证书进行了锁定,它都不会接受任何其他证书作为叶证书。这个想法是满足所有要求,而不仅仅是一些要求。

    如果只是固定到 CA 证书,则将完成正常的证书验证(特别是该主题与预期域匹配),此外还将检查固定的 CA 是否在信任路径中。

    【讨论】:

    • “它不会接受任何其他证书作为叶证书,无论是否还针对 CA 证书进行了固定”。这是错误的。我测试了一个无效的叶子证书,但相同的根证书和连接被接受了。
    • @Nateshbhat:“我测试了....” - 正如你所看到的,我描述了可以实现固定的各种方式 - 没有单一的方式包含所有 TLS 堆栈,操作系统、应用程序等。我不知道您是如何实现它以及在哪个环境中实现的。但是考虑到您从测试中得到的结果,看起来您以不安全的方式实现了它,因为显然它不应该那样做。
    【解决方案2】:

    我使用 ClientChannel 的 setTrustedCertificates 方法在 dart 应用程序中测试了固定 SSL 证书(以 pem 文件形式的证书)。

    观察:

    在以下情况下成功建立连接:

    • 当有效的根证书、有效的中间证书和 NUCLEI 的 NON EXPIRED 叶证书被固定时。
    • 当有效的根证书、有效的中间证书和 NUCLEI 的 EXPIRED 叶证书被固定时。
    • 当有效的根证书、有效的中间证书和无效的叶证书被固定时。
    • 仅固定 VALID NUCLEI 的叶子证书时。
    • 当一个 NON EXPIRED Nuclei 的叶子证书和一个 EXPIRED Nuclei 的叶子证书被固定时。

    连接失败,出现 CERTIFICATE_VERIFY_FAILED 错误:

    • 仅固定 INVALID 叶证书时。
    • 当 EXPIRED 叶证书被固定时。

    结论:

    • 固定单个主机的所有根、中间和叶证书是没有意义的。
    • 任何无效的恶意叶子证书但由相同的根证书或中间证书签名也被接受。
    • 所以最好只固定叶子证书。但是,如果担心叶子证书过期,那么我们必须固定中间证书,然后从 pin 中删除叶子证书。
    • 为了最大的安全性
      • 我们应该只固定叶子证书。
      • 为了应对证书过期问题,我们可以固定多个不同过期时间的叶子证书。
      • 如果固定多个叶证书不是一种选择,那么最好的选择是固定中间证书并从固定中删除所有其他证书。

    【讨论】:

    • “我做了一些测试......” - 在什么平台、哪个应用程序、哪个 TLS 堆栈、哪个特定的 pinning 实现上?没有单一的方法。对我来说,您的实现看起来是错误且不安全的,因为您没有将固定实现为 ALL 必须满足这些条件,而是必须满足这些条件中的 ANY遇到了。
    • 我不认为 setTrustedCertificates 首先是实现固定的正确方法。这不是关于固定,而是关于设置可能的信任锚以进行验证。这意味着如果 任何 给定证书在信任路径中,它将信任证书,无论是叶证书还是 CA 证书。换句话说:固定的行为并不像您描述的那样,而是您没有正确实施固定。
    猜你喜欢
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 2014-04-10
    • 2017-06-25
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多