2

我用 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);

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

4

1 回答 1

4

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

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

我还写了一本书,A Guide to OpenSAML,其中我详细解释了使用 OpenSAML 的加密和签名等。

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

签名验证器使用发送者的公钥实例化,以验证发送者的公钥。这通常交换是使用SAML 元数据建立身份联合

于 2013-01-30T12:59:01.997 回答