我有一些关于如何使用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证书不同,因此失败。正确的吗?
答案 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
)中,并且可能会在以后的版本中进行修改。
因此异常有点误导,但系统行为正常。