【问题标题】:SAML 2.0 - How to verify the sender certificate?SAML 2.0 - 如何验证发件人证书?
【发布时间】:2013-01-14 05:24:04
【问题描述】:

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

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

【问题讨论】:

  • 您好,您是如何发送请求并获得响应的?我也在尝试实施 SAML SSO

标签: java saml saml-2.0 opensaml


【解决方案1】:

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

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

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

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

签名验证器使用发送者的公钥实例化,以验证发送者的公钥。这通常交换为使用SAML Metadata 的身份联合设置

【讨论】:

  • 谢谢!如我所见,您写道:“PS。此验证仅对签名执行加密验证。它不会检查用于针对任何受信任 CA 进行签名的证书。要确认证书的有效性,必须在验证。”。这正是我所需要的——确认证书的有效性。你知道怎么做吗?
  • 此解决方案根据元数据中交换的公钥验证签名。在元数据中进行这种交换是正常的,这也消除了对任何外部 CA 的需要。在示例中,“cred”包含要验证的公钥
  • 好吧,我想我明白了。谢谢!
  • 如果答案解决了您的问题,请将其标记为正确。否则请回复我的评论。我很高兴回答有关 OpenSAML 的任何问题
  • 这个答案虽然被接受,但不包含任何信息