如何验证 SAML 证书?

How to verify SAML certificates?

我是 SAML 的新手,对预期的签名和信任过程感到困惑。

我正在编写 SP 并从 IDP 收到签名的 samlp:Response,其中包括 KeyInfo:

<KeyInfo>
    <ds:X509Data>
        <ds:X509Certificate>
            MIIC4DCCAcigAwIBAgIQRzFzcQiEKpFD2C+gNZ8cFDANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDEyFBREZTIFNpZ25pbmcgLSB0ZXN0Lmx1Y2lkYXV0aC5jb20wHhcNMTYwNTA2MDcyODM5WhcNMTcwNTA2MDcyODM5WjAsMSowKAYDVQQDEyFBREZTIFNpZ25pbmcgLSB0ZXN0Lmx1Y2lkYXV0aC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDqng7wxIkT7VpVJhQYgwWMngST4EhxWha+vI9/5V+D0nWZXp6MIMiFO7rv0n4+og7fdVXHjK9wL4cG9MVUMFpV8cxl7lmwKC/EomPbdsHZfCQ4QE/M+jHUDRoyeqSZgUO1oMigz65FzSdtRoM6A3TKasU5+ISttvGx66gkP5wuQUllBfDJxuVA+5qPVLas5/0s/CCyVbKPDqYwn/GMKsTc1ECy8oEeBOrfRzEsQrqlkLcoriMXYIRW92j4MWUTnz3Ce4zTGPldPl2ix/dVk02MoJEgK7NTDru+2yvo0QDIvzWWs0rltF26UdABqsiq+uuwYiKkGQpBldyjfqVvmwChAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAKeywqRnNuBGaNB6k6wuDAK6Aknx28RXbJAMe9SkSAo6L16qbdRdL8JCGZCDRF7OI8GLMEZj+yStRPikEstBQYeOi+1OSDf6iqOr7LM/OURG3pNq/LUOdNJJcYUSuK3FPP4HSMOo6dOX5IHS+7OOh70CMg5dfdtjvHqb8ZsRUk30JX9nVcXXRO8Vqzgb7WjuVjGvz/zSR6Dy+f+N6UDerIauQxHPu81SasxEUE4R6pr/Tm80E6uoicp7VBtE8YGHBhag9c+rp/xLANJ+Oc0poKDvLr8odnlUvEgy5RQhqbPefQ9n8E5Pba2IA0w/tfsk0w/z2jNwgLzNCfJGyrGHiH4=
        </ds:X509Certificate>
    </ds:X509Data>
</KeyInfo>

我假设包含证书,这样我就不必猜测是哪个证书签署了响应。

但这现在看来用处不大。似乎没有包含证书链。所以我真的不能相信回复。

我想证书可以通过第二个受信任的带外协议提供给我,但这似乎不是正确的解决方案,因为每次证书过期时都必须重复。

如果给定 X509 链(例如 SSL),这是一个非常容易解决的问题。

考虑到证书可能会过期,验证 X509 证书信任的推荐方法是什么?

I suppose the certificate could be given me via a second, trusted out-of-band protocol.

这就是 SAML 实施的典型做法。 SAML 使用证书基础结构作为 "highly generic and extensible means of communicating key material. This specification takes no position on the allowable or suggested content of this element, nor on its meaning to a relying party. As a concrete example, no implications of including an X.509 certificate by value or reference are to be assumed. Its validity period, extensions, revocation status, and other relevant content may or may not be enforced, at the discretion of the relying party."

as that must be repeated every time the certificate expires.

由于过期通常不是强制执行的,所以这无关紧要。重要的是密钥何时更改(密钥翻转)。为了解决这个问题,证书通常是从 Idp 发布的元数据中加载的。这意味着最终 Idp 上的元数据端点的 TLS 证书是信任的基础。

还有一些情况下 TLS 不够可信(我在医疗保健领域有过这种经历),并且证书仅通过安全的 out-of-band 通信渠道(例如面对面会议)进行交换。