当前位置: 首页 > 知识库问答 >
问题:

SSL对等方在Spring SAML中主机名验证失败

龚寂弦
2023-03-14

我正试图将我的Spring Boot项目配置为对第三方IDP使用SAML身份验证。我已经实现了使vdenotaris中的配置与SSOCycle提供程序一起工作,现在我想将其切换到其他提供程序。

SAML元数据endpoint启用了HTTPS,我已经创建了一个密钥库,其中包含元数据中给出的证书(用于签名和加密)和HTTPendpoint提供的证书(基于此答案)。然后,我将它们保存在证书文件($CERTIFICATE_FILE)中,并使用此脚本生成我的密钥库:

keytool -delete -alias third-party -keystore $KEYSTORE_FILE -storepass $KEYSTORE_PASSWORD
keytool -import -alias third-party -file $CERTIFICATE_FILE -keystore $KEYSTORE_FILE -storepass $KEYSTORE_PASSWORD -noprompt
keytool -genkeypair -alias mycompany -keypass mycompanypass -keystore $KEYSTORE_FILE

然后,当使用此密钥库检索 SAML 元数据时,我收到以下错误:

org.opensaml.saml2.metadata.provider.MetadataProviderException: org.opensaml.saml2.metadata.provider.MetadataProviderException: Error retrieving metadata from https://third.party.provider/metadata
    at org.opensaml.saml2.metadata.provider.HTTPMetadataProvider.fetchMetadata(HTTPMetadataProvider.java:274)
    at org.opensaml.saml2.metadata.provider.AbstractReloadingMetadataProvider.refresh(AbstractReloadingMetadataProvider.java:267)
    at org.opensaml.saml2.metadata.provider.AbstractReloadingMetadataProvider.doInitialization(AbstractReloadingMetadataProvider.java:236)
    at org.opensaml.saml2.metadata.provider.AbstractMetadataProvider.initialize(AbstractMetadataProvider.java:407)
    at org.springframework.security.saml.metadata.ExtendedMetadataDelegate.initialize(ExtendedMetadataDelegate.java:167)
    at org.springframework.security.saml.metadata.MetadataManager.initializeProvider(MetadataManager.java:412)
    at org.springframework.security.saml.metadata.MetadataManager.refreshMetadata(MetadataManager.java:238)
    at org.springframework.security.saml.metadata.CachingMetadataManager.refreshMetadata(CachingMetadataManager.java:86)
    at org.springframework.security.saml.metadata.MetadataManager$RefreshTask.run(MetadataManager.java:1040)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)
Caused by: org.opensaml.saml2.metadata.provider.MetadataProviderException: Error retrieving metadata from https://third.party.provider/metadata
    at org.opensaml.saml2.metadata.provider.HTTPMetadataProvider.fetchMetadata(HTTPMetadataProvider.java:274)
    at org.opensaml.saml2.metadata.provider.AbstractReloadingMetadataProvider.refresh(AbstractReloadingMetadataProvider.java:255)
    ... 9 common frames omitted
Caused by: javax.net.ssl.SSLPeerUnverifiedException: SSL peer failed hostname validation for name: null
    at org.opensaml.ws.soap.client.http.TLSProtocolSocketFactory.verifyHostname(TLSProtocolSocketFactory.java:233)
    at org.opensaml.ws.soap.client.http.TLSProtocolSocketFactory.createSocket(TLSProtocolSocketFactory.java:186)
    at org.springframework.security.saml.trust.httpclient.TLSProtocolSocketFactory.createSocket(TLSProtocolSocketFactory.java:97)
    at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707)
    at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.open(MultiThreadedHttpConnectionManager.java:1361)
    at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387)
    at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
    at org.opensaml.saml2.metadata.provider.HTTPMetadataProvider.fetchMetadata(HTTPMetadataProvider.java:250)
    ... 10 common frames omitted

这些是我的配置的相关部分,基于vdenotaris的链接项目:

// Setup TLS Socket Factory
@Bean
public TLSProtocolConfigurer tlsProtocolConfigurer() {
    return new TLSProtocolConfigurer();
}

@Bean
public ProtocolSocketFactory socketFactory() {
    return new TLSProtocolSocketFactory(keyManager(), null, "allowAll");
}

@Bean
public Protocol socketFactoryProtocol() {
    return new Protocol("https", socketFactory(), 443);
}

@Bean
public MethodInvokingFactoryBean socketFactoryInitialization() {
    MethodInvokingFactoryBean methodInvokingFactoryBean = new MethodInvokingFactoryBean();
    methodInvokingFactoryBean.setTargetClass(Protocol.class);
    methodInvokingFactoryBean.setTargetMethod("registerProtocol");
    Object[] args = { "https", socketFactoryProtocol() };
    methodInvokingFactoryBean.setArguments(args);
    return methodInvokingFactoryBean;
}

// Central storage of cryptographic keys
@Bean
public KeyManager keyManager() {
    DefaultResourceLoader loader = new DefaultResourceLoader();
    Resource storeFile = loader.getResource("classpath:/saml/mySamlKeystore.jks");
    String storePass = "storepass";
    Map<String, String> passwords = new HashMap<String, String>();
    passwords.put("mycompany", "mycompanypass");
    String defaultKey = "mycompany";
    return new JKSKeyManager(storeFile, storePass, passwords, defaultKey);
}

然而,在这里我发现了一些误解。据我所知,TLSProtocolConfigurer本身创建了一个TLSProtocolSocketFactory,为什么示例项目同时创建了这两个bean?根据文档,使用TLSProtocolConfigurer应该足够了,但是如何创建socketFactoryProtocol()

如果这里有灯光我会很感激的。

共有3个答案

顾兴昌
2023-03-14
@Bean
    @Qualifier("idp-ssocircle")
    public ExtendedMetadataDelegate ssoCircleExtendedMetadataProvider()
        throws MetadataProviderException {
    String idpSSOCircleMetadataURL = "https://idp.ssocircle.com/idp-meta.xml";
    HTTPMetadataProvider httpMetadataProvider = new HTTPMetadataProvider(
            this.backgroundTaskTimer, httpClient(), idpSSOCircleMetadataURL);
    httpMetadataProvider.setParserPool(parserPool());
    ExtendedMetadataDelegate extendedMetadataDelegate = 
            new ExtendedMetadataDelegate(httpMetadataProvider, extendedMetadata());
    extendedMetadataDelegate.setMetadataTrustCheck(false);
    extendedMetadataDelegate.setMetadataRequireSignature(false);
    backgroundTaskTimer.purge();
    return extendedMetadataDelegate;
}

extendedMetadataDelegate.setMetadataTrustCheck(false);

高朝明
2023-03-14

我没有为导入的证书文件提供密码:

@Bean
public KeyManager keyManager() {
    DefaultResourceLoader loader = new DefaultResourceLoader();
    Resource storeFile = loader.getResource("classpath:/saml/mySamlKeystore.jks");
    String storePass = "storepass";
    Map<String, String> passwords = new HashMap<String, String>();
    passwords.put("mycompany", "mycompanypass");
    passwords.put("third-party", "mycompanypass");
    String defaultKey = "mycompany";
    return new JKSKeyManager(storeFile, storePass, passwords, defaultKey);
}

这样,应用程序就可以从密钥库读取证书并信任它们,而无需将它们安装在JDK证书库中。

幸弘光
2023-03-14

这是我的JKS密钥管理器bean配置。

@Bean
public ProtocolSocketFactory socketFactory() {
return new TLSProtocolSocketFactory(keyManager(), null, "default");
}

@Bean
public KeyManager keyManager() {
DefaultResourceLoader loader = new DefaultResourceLoader();
Resource storeFile = loader.getResource("classpath:/saml/samlKeystore.jks");
String storePass = keyStorePwd;
Map<String, String> passwords = new HashMap<String, String>();
passwords.put(keyStoreAlias, keyStorePwd);
String defaultKey = keyStoreAlias;
return new JKSKeyManager(storeFile, storePass, passwords, defaultKey);

}

看起来 IDP 已更改其公共证书,该证书在我们的本地密钥库 (samlKeystore.jks) 中不可用。我使用OpenSSL命令手动下载了他们的公共证书,并使用keytool实用程序导入了相同的证书。

openssl s_client -showcerts -connect iam-sso.google.net:443 </dev/null 2>/dev/null|openssl x509 -outform PEM >mycertfile.pem
keytool -import -alias "new-public-cert" -keystore /usr/share/tomcat8/webapps/ROOT/WEB-INF/classes/saml/samlKeystore.jks
 类似资料:
  • 问题内容: 我正在开发一个Android应用,并且需要访问一个HTTPS地址。我正在使用Volley来请求我的数据,但现在却收到此错误 要获得SSL工厂,我需要这样做: 队列初始化: 这是堆栈跟踪: 我搜索了错误,但没有找到适合我的情况的内容。谁能帮我? 问题答案: 让我们假设你的服务器的应用程序是具有服务器证书中的服务器机内托管的,例如。然后,在验证方法内部,您可以验证。 您可以通过以下链接阅读

  • 作为服务提供商,我正在使用spring saml与第三方IDP服务器集成。 我们插入了2个X.509证书一个用于签名,另一个用于加密,以及一个来自IDP的SSL证书作为java密钥存储库中的公钥。 环境: Java版本:1.7 Spring版本:4.3.7。发布 Spring Security版本:4.2.2。发布 spring-security-saml2-core:1.0.2。释放 错误描述:

  • 我无法将我的spring boot应用程序(v1.5.7)连接到我的mongodb服务器(带有ssl(Win7_x64)的本地主机);v、 3.4.6;自我签名;没有ssl的登录正在运行)。 RoboT3与我的mongodb连接没有问题。 我遵循了几种解决方案,这是我最后一次尝试但没有成功: 在我的主要课程中添加了以下内容: 我在本文之后创建了信任存储和keyStore。 ca、客户端和服务器的c

  • 我们使用Spring SAML扩展将Salesforce设置为IDP,我们的应用程序是SP。但我们得到错误“SSL对等方未能通过名称:null的主机名验证” 下面是我们的 SAML 配置类。 我们尝试了将“Spring Security SAML HTTPS链接到另一个页面”的建议,其中1)禁用主机名验证,或2)注释掉Bean“TLSProtocolConfigurer”,并将Salesforce

  • 问题内容: 我的 詹金斯(Jenkins) 有问题,设置为“ git”,显示以下错误: 我已经用 ssh 测试过: 这是错误的: 我还使用“ SSH密钥”完成了这些步骤。 在詹金斯下登录 将您的github密钥复制到Jenkins .ssh文件夹 重命名键 但仍然无法在 jenkins中使用* git 仓库。 * 感谢帮助!。 问题答案: 更改为用户并手动运行命令: 首次通过SSH连接到新主机时,

  • 我对jenkins有一个问题,设置“Git”,显示以下错误: 我已经用ssh进行了测试: 这是错误: 谢谢你的帮助!。