Spring Security SAML - HTTPS连接

时间:2015-04-03 16:02:24

标签: spring-saml

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

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

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

当我点击我的SP时,我被重定向到我的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绑定一起使用)需要验证服务器提供的公钥,并且应该检索证书并将其作为通常的公钥导入密钥库。我假设这意味着在JKSKeyManager中定义的SP的密钥库。当我从我的IDP将SSL证书导入SP密钥库时,错误消失了,一切都很顺利。

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

第二个问题 如果我没有将证书导入SP密钥库并将sslSecurityProfile值更改为metaiop,我仍然会在同一点上收到错误,但即使我设置{SSL peer failed hostname validation for name: null也是如此{1}}到sslHostnameVerification。为什么会这样?

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

1 个答案:

答案 0 :(得分:3)

是的,在工件解析期间打开的HTTPS连接仅使用来自samlKeystore.jks(或其他已配置的KeyManager)的密钥进行信任解析,cacerts将被忽略。

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

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

我认为主机名验证失败的原因是由于Java 8中的一些变化。春天SAML会从CertificateException抛出X509TrustManager - 向JDK表明服务器不受信任,但JDK不会进一步报告此异常,而是返回一个空的SSLSession - 后来在主机名验证时失败,因为它的主机名为null。

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

因此异常有点误导,但系统行为正常。