2015-04-03 152 views
1

我有几个关于如何使用Spring Security SAML扩展v1.0发布来处理SSL(HTTPS)连接的问题。Spring Security SAML - HTTPS连接

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

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

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

第二个问题 如果我不导入证书到SP密钥存储和改变sslSecurityProfile价值metaiop,我还得到一个错误在同一点上,而是它说:SSL peer failed hostname validation for name: null即使我设置sslHostnameVerificationallowAll。为什么会发生?

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

回答

3

是的,在Artifact解析期间打开的HTTPS连接仅使用samlKeystore.jks(或其他配置的KeyManager)中的密钥进行信任解析,因此忽略cacerts。

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

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

我相信系统主机名验证失败的原因是由于Java 8中的一些变化所致。Spring SAML将从X509TrustManager中抛出CertificateException--向JDK表明服务器不可信,但JDK不报告此异常进一步,而是它返回一个空的SSLSession - 随后主机名为空的主机名验证失败。

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

所以这个例外是有点误导,但否则系统的行为是正确的。

+0

谢谢弗拉基米尔! – AndyB 2015-04-03 19:36:12

+0

嘿Vladimír,任何想法为什么我得到这个错误在这里/ saml/SSO(后)一旦它从IDP回来? java.lang.NoClassDefFoundError:无法初始化类org.apache.commons.ssl.TrustMaterial – Gemasoft 2016-12-14 15:28:53

相关问题