SAML 2.0 - 如何验证发件人证书?

use*_*949 2 java saml opensaml saml-2.0

我用 Java 实现了一个 SAML SP。
我向 SAML 2.0 IDP 发送 AuthnRequest 并获得加密响应。
我的问题是:
我如何确保响应确实来自 IDP 而不是来自黑客?
仅验证签名是不够的,因为这只会告诉我发件人有一对匹配的私钥/公钥,但它可以是任何人。
所以,我需要 IDP 提前为我提供一个我上传到 jks 文件的证书,并每次将它与我从响应的 ds:X509Certificate 元素中提取的证书进行比较。
现在,是否有一种标准方法可以将发件人的证书与存储在我的密钥库中的证书进行比较?
我看到了以下代码:

 KeyStore keyStore = getKS();
 PKIXParameters params = new PKIXParameters(keyStore);
 params.setRevocationEnabled(false);
 CertPath certPath = certificateFactory.generateCertPath(Arrays.asList(certFromResponse));
 CertPathValidator certPathValidator = CertPathValidator.getInstance(CertPathValidator.getDefaultType());
 CertPathValidatorResult result = certPathValidator.validate(certPath, params);
Run Code Online (Sandbox Code Playgroud)

够了吗?如果验证没有抛出异常,它会验证发件人的身份吗?

Ste*_*son 5

这是我用 OpenSAML 解决签名验证的方法

https://blog.samlsecurity.com/2012/11/verifying-signatures-with-opensaml.html

我还写了一本书,OpenSAML 指南,我在其中详细解释了加密和签名以及更多使用 OpenSAML 的内容。

OpenSAML 验证方法的重要之处在于它们仅验证签名的加密有效性(内容未更改)。但是,它不会验证发件人是否是您信任的人。

签名验证器使用发件人的公钥进行实例化,以根据发件人的公钥进行验证。这通常是使用SAML 元数据设置联合身份验证

  • 这个答案虽然被接受,但不包含任何信息 (4认同)