spring-saml - Spring Security SAML - HTTPS 连接

标签 spring-saml

我有一些关于如何使用 Spring Security SAML 扩展 v1.0 版本处理 SSL (HTTPS) 连接的问题。

我正在使用该扩展来开发 SP。我正在使用的远程 IDP 有一个 HTTPS URL。我在 Tomcat 使用的 JRE cacerts keystore 中拥有该 SSL 证书的根证书和颁发证书。 IDP 的元数据通过 HTTPMetadataProvider 加载得很好。在我的 SP 元数据的 ExtendedMetadata 中,我有:

<property name="securityProfile" value="metaiop"/>
<property name="sslSecurityProfile" value="pkix"/>

当我访问 SP 时,我会正常重定向到 IDP,并提供我的凭据。然后 IDP 将我送回 SP。但我在这里遇到错误 错误 org.springframework.security.saml.trust.MetadataCredentialResolver PKIX 路径构造因不受信任的凭据失败

日志显示这是在 SOAP 消息构建后立即发生的。我认为我的 SP 正在尝试连接到我的 IDP 以进行工件解析。

在 Spring SAML 文档的第 7.2.3 节中,它表示默认情况下 HTTPS 元数据连接将使用 Java 的 keystore 。我已经按照上面的说明处理好了。但在第 8.1.4 节中,它表示直接 SSL/TLS 连接(与 HTTP-Artifact 绑定(bind)一起使用)需要验证服务器提供的公钥,并且应检索证书并将其作为常用公钥导入到 keystore 中。我假设这意味着 SP 的 keystore 在 JKSKeyManager 中定义。当我将 SSL 证书从 IDP 导入 SP keystore 时,错误消失,一切正常。

第一个问题 这是处理这个问题的正确方法吗?通过 HTTPS 进行的工件解析是否可以不使用 JRE 的 cacerts keystore ?

第二个问题 如果我不将证书导入 SP keystore 并将 sslSecurityProfile 值更改为 metaiop,我仍然会在同一点收到错误,但它会显示 SSL即使我将 sslHostnameVerification 设置为 allowAll,对等方仍无法对 name: null 进行主机名验证。为什么会发生这种情况?

根据我对 MetaIOP 配置文件的理解,它在 IDP 的元数据中查找证书。由于该证书与 SSL 证书不同,因此会失败。对吗?

最佳答案

是的,Artifact 解析期间打开的 HTTPS 连接仅使用 samlKeystore.jks(或另一个配置的 KeyManager)中的 key 进行信任解析,cacerts 将被忽略。

将 SSL 上的安全配置文件更改为 MetaIOP 意味着您必须导入 HTTPS 端点上使用的确切证书(导入到 keystore 或 IDP 的元数据 - 它会检查两者)。系统也不会验证证书的有效性(或通过标准 PKIX 算法验证的任何其他值)。

使用PKIX,您可以导入证书颁发机构的证书,系统将自动信任该机构颁发的证书。

我相信系统在主机名验证上失败的原因是由于 Java 8 中的一些更改。Spring SAML 将从 X509TrustManager 抛出 CertificateException - 向 JDK 指示服务器不受信任,但 JDK 不会进一步报告此异常,而是返回一个空的 SSLSession - 随后由于主机名为 null,因此主机名验证失败。

检查 SSLSession 是否正确打开的主机名验证逻辑位于 OpenSAML (TLSProtocolSocketFactory) 中,并且可能会在以后的版本中进行修改。

所以这个异常有点误导,但除此之外系统的行为是正确的。

关于spring-saml - Spring Security SAML - HTTPS 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29435629/

相关文章:

java - 在反向代理后面使用 SP 时 Spring saml 出现问题

Spring SAML - 在运行时读取和刷新 IdP 元数据

java - SAML Java Spring Boot - PKIX 路径构造因不受信任的凭证而失败

spring-security - 用于单点登录服务的查询字符串参数的 Spring SAML 扩展条

spring-mvc - Spring 样本: Key is too long for unwrapping: invalidkeyexception

java - Spring Saml 中的显式 SAML 属性

java - 如何在向 IDP 发送身份验证请求时将当前 URL 作为中继状态发送

java - 构建 SAML IDP

java - 如何使用 spring saml 应用程序的公钥和私钥创建 JKS 文件?

Spring Security SAML 扩展 - 从 Idp 单一注销的回调