我正在JBOSS中实现SP发起的Web浏览器SAML SSO配置文件.
我的申请是SP.
登录后,我希望IDP向我发送以下格式的加密断言:
<samlp:Response...>
<ds:Signature>...
<ds:KeyInfo>....</ds:KeyInfo>
</ds:Signature>
<samlp:Status>...</samlp:Status>
<saml:EncryptedAssertion>...</saml:EncryptedAssertion>
</samlp:Response>
Run Code Online (Sandbox Code Playgroud)
它适用于一些国内流离失所者,但现在我有一个IDP给我发送:
<saml2p:Response...>
<saml2p:Status>...</saml2p:Status>
<saml2:EncryptedAssertion>...
<ds:KeyInfo>...</ds:KeyInfo>
</saml2:EncryptedAssertion>
</saml2p:Response>
Run Code Online (Sandbox Code Playgroud)
由于签名丢失,身份验证失败.
我的问题是:是否有标准格式的SAML 2.0加密断言,我可以告诉IDP管理员使用?或者我必须支持两种方式吗?
谢谢
我在网上找到了关于这个问题的一些讨论,但没有一个对我有用。
我正在尝试使用 TLS 连接通过 LDAP 进行身份验证。
使用 ldapsearch 命令和 Java 代码时,我得到了矛盾的响应。
在 ldapsearch 命令中,使用 TLS 搜索可以工作,没有它则失败;
而在 Java 代码中,标准 LDAPS 连接可以工作,而 TLS 会失败。
这是 ldap 搜索结果:
使用 TLS:
/usr/bin/ldapsearch -h ldap.server.com -Z -x -D "#BIND_DN#" -W -b "#SEARCH_BASE#" -s sub "(cn=#USERNAME#)"
输入 LDAP 密码:XXXXXXXX
....
邮件:test.user@ldap.server.com
结果:0 成功
没有 TLS:
/usr/bin/ldapsearch -h ldap.server.com -p 636 -x -D "#BIND_DN#" -W -b "#SEARCH_BASE#" -s sub "(cn=#USERNAME#)"
输入 LDAP 密码: XXXXXXXXX
ldap_result:无法联系 LDAP 服务器 (-1)
以下是 Java 结果:
没有 TLS:
>>java -cp lib …Run Code Online (Sandbox Code Playgroud) 我用 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)
够了吗?如果验证没有抛出异常,它会验证发件人的身份吗?