Spring 安全 SAML - HTTPS 连接

Spring Security SAML - HTTPS connections

关于 Spring 安全 SAML 扩展 v1.0 版本如何处理 SSL (HTTPS) 连接,我有几个问题。

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

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

当我点击我的 SP 时,我被重定向到我的 IDP,并且我提供了我的凭据。然后 IDP 将我送回我的 SP。但我在这里得到一个错误 ERROR org.springframework.security.saml.trust.MetadataCredentialResolver PKIX path construction failed for untrusted credential

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

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

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

第二个问题 如果我不将证书导入 SP 密钥库并将 sslSecurityProfile 值更改为 metaiop,我仍然会在同一点收到错误,但它会显示 SSL peer failed hostname validation for name: null,即使我设置 sslHostnameVerificationallowAll。为什么会这样?

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

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

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

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

我认为系统在主机名验证上失败的原因是 Java 8 中的一些更改。Spring SAML 将从 X509TrustManager 中抛出 CertificateException -向 JDK 表明服务器不受信任,但 JDK 没有进一步报告此异常,而是 returns 一个空的 SSLSession - 后来主机名验证失败,因为它的主机名是空。

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

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