我用Java实现SAML SP
我将一个AuthnRequest发送给SAML 2.0 IDP并获得加密响应
我的问题是:
我如何确保响应确实来自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);
够了吗?如果验证没有抛出异常,它会验证发件人的身份吗?
答案 0 :(得分:3)
这是我用OpenSAML解析签名验证的方式
http://blog.samlsecurity.com/2012/11/verifying-signatures-with-opensaml.html
我还写了一本书A Guide to OpenSAML,在那里我详细解释加密和签名以及更多使用OpenSAML。
OpenSAML验证方法的重要之处在于它们只验证签名的加密有效性(内容未被更改)。但是,它不会验证发件人是您信任的人。
签名验证器使用发件人的公钥进行实例化,以验证发件人的公钥。通常交换的是使用SAML Metadata
设置身份联合