Java SAML元数据项的签名信任建立失败

Java SAML元数据项的签名信任建立失败,java,spring,spring-security,saml-2.0,spring-saml,Java,Spring,Spring Security,Saml 2.0,Spring Saml,为了从远程源获取元数据,我定义了一个ExtendedMetadataDelegatebean,如下所示: @Bean @Qualifier("replyMeta") public ExtendedMetadataDelegate replyMetadataProvider() throws MetadataProviderException { String metadataURL = "https://ststest.mydomain.it/FederationMetadata/200

为了从远程源获取元数据,我定义了一个
ExtendedMetadataDelegate
bean,如下所示:

@Bean
@Qualifier("replyMeta")
public ExtendedMetadataDelegate replyMetadataProvider() throws MetadataProviderException {
    String metadataURL = "https://ststest.mydomain.it/FederationMetadata/2007-06/FederationMetadata.xml";
    final Timer backgroundTaskTimer = new Timer(true);
    HTTPMetadataProvider provider = new HTTPMetadataProvider(
            backgroundTaskTimer, httpClient(), metadataURL);
    provider.setParserPool(parserPool());
    ExtendedMetadataDelegate emd = new ExtendedMetadataDelegate(
            provider, new ExtendedMetadata());
    return emd;
}
为了确保签名信任的建立,我在JDK密钥库和应用程序密钥库中都添加了相关密钥(第二步可能不够);尽管如此,运行webapp还是会发生错误

[2014-08-18 14:36:47.200] boot - 6000 DEBUG [localhost-startStop-1] --- SignatureValidator: Attempting to validate signature using key from supplied credential
[2014-08-18 14:36:47.200] boot - 6000 DEBUG [localhost-startStop-1] --- SignatureValidator: Creating XMLSignature object
[2014-08-18 14:36:47.206] boot - 6000 DEBUG [localhost-startStop-1] --- SignatureValidator: Validating signature with signature algorithm URI: http://www.w3.org/2001/04/xmldsig-more#rsa-sha256
[2014-08-18 14:36:47.207] boot - 6000 DEBUG [localhost-startStop-1] --- SignatureValidator: Validation credential key algorithm 'RSA', key instance class 'sun.security.rsa.RSAPublicKeyImpl'
[2014-08-18 14:36:47.329] boot - 6000 DEBUG [localhost-startStop-1] --- SignatureValidator: Signature validated with key from supplied credential
[2014-08-18 14:36:47.329] boot - 6000 DEBUG [localhost-startStop-1] --- BaseSignatureTrustEngine: Signature validation using candidate credential was successful
[2014-08-18 14:36:47.330] boot - 6000 DEBUG [localhost-startStop-1] --- BaseSignatureTrustEngine: Successfully verified signature using KeyInfo-derived credential
[2014-08-18 14:36:47.330] boot - 6000 DEBUG [localhost-startStop-1] --- BaseSignatureTrustEngine: Attempting to establish trust of KeyInfo-derived credential
[2014-08-18 14:36:47.330] boot - 6000 DEBUG [localhost-startStop-1] --- BasicX509CredentialNameEvaluator: Supplied trusted names are null or empty, skipping name evaluation
[2014-08-18 14:36:47.331] boot - 6000 DEBUG [localhost-startStop-1] --- MetadataCredentialResolver: Attempting PKIX path validation on untrusted credential: [subjectName='CN=ADFS Signing - ststest-replynet.reply.it']
[2014-08-18 14:36:47.346] boot - 6000 ERROR [localhost-startStop-1] --- MetadataCredentialResolver: PKIX path construction failed for untrusted credential: [subjectName='CN=ADFS Signing - ststest-replynet.reply.it']: unable to find valid certification path to requested target
[2014-08-18 14:36:47.347] boot - 6000 DEBUG [localhost-startStop-1] --- PKIXSignatureTrustEngine: Signature trust could not be established via PKIX validation of signing credential
[2014-08-18 14:36:47.347] boot - 6000 DEBUG [localhost-startStop-1] --- BaseSignatureTrustEngine: Failed to establish trust of KeyInfo-derived credential
[2014-08-18 14:36:47.347] boot - 6000 DEBUG [localhost-startStop-1] --- BaseSignatureTrustEngine: Failed to verify signature and/or establish trust using any KeyInfo-derived credentials
[2014-08-18 14:36:47.347] boot - 6000 DEBUG [localhost-startStop-1] --- PKIXSignatureTrustEngine: PKIX validation of signature failed, unable to resolve valid and trusted signing key
[2014-08-18 14:36:47.347] boot - 6000 ERROR [localhost-startStop-1] --- SignatureValidationFilter: Signature trust establishment failed for metadata entry http://ststest-replynet.reply.it/adfs/services/trust
[2014-08-18 14:36:47.349] boot - 6000 ERROR [localhost-startStop-1] --- AbstractReloadingMetadataProvider: Error filtering metadata from https://ststest-replynet.reply.it/FederationMetadata/2007-06/FederationMetadata.xml
org.opensaml.saml2.metadata.provider.FilterException: Signature trust establishment failed for metadata entry
通过设置以下各项,错误消失:

emd.setMetadataTrustCheck(false); 
。。。但我想检查一下用过的元数据

有没有办法解决这个错误


更新: 我尝试按如下方式设置
扩展元数据
,但错误仍然存在

em.setAlias("defaultAlias");
em.setSigningKey("*.mydomain.it (Go Daddy Secure Certification Authority)");

您很可能导入了HTTPS证书,但没有导入用于创建签名的证书-它们不同。你应该:

  • 使用元数据中的以下内容创建文件signature.cer:

    -----BEGIN CERTIFICATE-----
    MIIC7jCCAdagAwIBAgIQa+pSaOoDP6ZL3qAi564CxzANBgkqhkiG9w0BAQs
    FADAzMTEwLwYDVQQDEyhBREZTIFNpZ25pbmcgLSBzdHN0ZXN0LXJlcGx5bm
    V0LnJlcGx5Lml0MB4XDTE0MDQyMTAwMzUyNVoXDTE1MDQyMTAwMzUyNVowM
    zExMC8GA1UEAxMoQURGUyBTaWduaW5nIC0gc3RzdGVzdC1yZXBseW5ldC5y
    ZXBseS5pdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJyI7Se
    +UGGHOGRcwHF8LrmivtcPJyNKyicPJ8UJ8pIsEmgYBnJIrpS05RkYtdUdk+
    aumDlc3ACt23FxGDLy9hkJJlRbZwklzh4W3RqGC3W5Y+t7KeIuB8d7ZrrLb
    2AoJpVHICRagsLjjHMwz9sJUt+PZdUFFc0pZckHba3TY2Y+MgPYVsyjlEkf
    QrwL0ggh23g9Pe1VQ9HaInXZvwVMGWZ1oL4Uk0cW11URa8x53ZOWMQSsksi
    MUlquItssiuJjRnI9Df+GaDxbQJi51esY2EF1o2JxqGJSA71Apy9EahDho8
    eFkfOS0fYbVNBU5X/Wn7BKsf2Rmg3r6mQM94+gAA8CAwEAATANBgkqhkiG9
    w0BAQsFAAOCAQEAIX5FEt5JWtINzy4C0LtTtta3DMOsLIBH3raRr53+6MKG
    sPP75VAt7fYUutopuk5Y2o++sVPuEuTzcogz5Dj8eglDESkPwR0PrlClVcG
    FLFEx9qOOidYIEa90g462niIOgkNkIpb1JRrmZEFo+yrYYdFSR2iXzC3O1f
    7JAhNwi+d4a8cOTrqynqL6p1z+hiWEub39FlWDPacELw9HSDIYY151hiiPz
    vIRQDBOjDg3Ws8fRwYNjJH4ElwjP2z+1r+sktD/kkh8jj3iWhT37JnQG72D
    7c63ovYICwEZUqS4L3vepO0pv6xewkUbfX4KBQbUPaVVgmVUcSecj85mvMx
    42g==
    -----END CERTIFICATE-----
    
  • 使用以下命令将证书导入samlKeystore.jks:

     keytool -importcert -alias adfssigning -keystore samlKeystore.jks -file signature.cer
    
  • 这应该是您所需要的全部,只需重新启动Tomcat,您的元数据加载现在就应该通过了

    如果包含以下配置HTTP客户端的bean(在Spring SAML 1.0.0.RELEASE中提供),则不需要在JDK的cacerts中包含HTTPS证书:


    我发布这篇文章只是为了以防万一,即使你做了所有事情都喜欢这个问题的答案,但仍然会得到相同的错误,这篇文章可能会有所帮助


    我也有这个问题,我添加了IDP的元数据文件,并将其证书导入到我的应用程序密钥库中。但仍然存在签名信任验证问题。我确实在Intellij中格式化了IDP中的metadata.xml,这搞砸了。一旦我导入了他们的元数据文件,没有格式化,一切都正常了。

    我也面临着同样的问题。我采取了一些步骤来解决同样的问题

  • 从IDP metdata fille中提取
  • 复制文本文件中的证书并另存为.crt。e、 g idp.crt
  • 在密钥存储中导入crt文件 keytool-import-alias adfscert-file idp.crt-keystore samlKeystoreold.jks-storepass keystorepass
  • 它会要求你相信这个crt。。答应
  • 在某些情况下,它会要求使用pkcs12格式的加载项警告消息,并执行相同的操作
  • 尝试运行您的应用程序它应该可以工作:)

  • 看起来这是因为
    无法找到请求目标的有效证书路径
    -您的信任库中是否有所有需要的证书?这里的更多信息我将证书添加到JDK(jre/lib/security/cacerts)和samlKeystore.jks中。
    emd.setMetadataTrustCheck(false)为我工作谢谢。。。我的信任无效,我无法控制您是如何生成签名.cer的?@Purefan您可以从身份提供程序共享的元数据中获取证书的。您可能可以从某个端点获得它,例如:,询问您正在使用的IP的管理员。将signing.cer添加到密钥库后,将其放在BEGIN/END CERTIFICATE标记7之间的一个空文件中,我会遇到同样的错误。。有什么想法吗?在spring或java中是否有一个示例代码可以快速匹配编辑的.cer和.jks并与元数据匹配,我正在重新启动服务器以重新测试所有内容,这需要花费很多时间,然后删除一个额外的选项卡或换行符,然后再次重新启动服务器。非常感谢,这为我节省了很多时间。我仍然不明白格式是如何把签名弄糟的。首先,我认为这是因为签名前后添加了空格,但不是因为这个。XML中的其他属性上可能还有其他空格将其搞乱“首先通过将作为签名一部分包含的数字哈希与根据内容计算的值进行比较来检查签名的有效性。”->格式化文件意味着更改其内容,这就是签名验证失败的原因。裁判
    
     <bean class="org.springframework.security.saml.trust.httpclient.TLSProtocolConfigurer"/>