0

我无法向我的 Shibboleth IdP 发出安全的 ECP AuthnRequest。我有一个小型的概念证明 SP 正在运行,它主要基于 Spring SAML 扩展示例应用程序。我的 SP 元数据是使用 Spring SAML 扩展示例应用程序的元数据生成器生成的。使用的签名密钥是示例应用程序 samlKeystore.jks 密钥库中包含的 apollo 密钥,所有这些也在我自己的小型 SP 应用程序中。

在我的 SP 元数据中,我将 AuthnRequestsSigned 属性设置为 true,如下所示:

<md:SPSSODescriptor AuthnRequestsSigned="true" WantAssertionsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">

如果我将 AuthnRequestsSigned 设置为 false 并将 ECP SOAP POST 发送到 IdP,它就可以正常工作。我从 IdP 获得了正确的 SOAP 消息。但如果该值为真,我会收到一条非描述性错误消息:

    <env:Fault>
        <faultcode>env:Client</faultcode>
        <faultstring>An error occurred processing the request.</faultstring>
        <detail/>
    </env:Fault>

我查看 Shibboleth (IdP) 日志并看到:

Attempting to extract credential from an X509Data
Found 1 X509Certificates
Found 0 X509CRLs
Single certificate was present, treating as end-entity certificate
Credentials successfully extracted from child {http://www.w3.org/2000/09/xmldsig#}X509Data by provider org.opensaml.xml.security.keyinfo.provider.InlineX509DataProvider
A total of 1 credentials were resolved

这会在我的交易日志中显示两次。我的假设是因为它在请求和我的 SP 元数据中找到了证书。在同一事务期间,在日志的更下方,我看到了这个,然后是堆栈跟踪:

Attempting to validate signature using key from supplied credential
Creating XMLSignature object
Validating signature with signature algorithm URI: http://www.w3.org/2000/09/xmldsig#rsa-sha1
Validation credential key algorithm 'RSA', key instance class 'sun.security.rsa.RSAPublicKeyImpl'
Signature did not validate against the credential's key
Signature validation using candidate validation credential failed
Signature did not validate against the credential's key

我将 ECP POST AuthnRequest 中的证书与我的 SP 元数据中用于“签名”的证书进行了比较,它们是相同的。所以我不确定为什么我会收到这个错误。

我的理解是,IdP 将获取在<ds:X509Certificate>请求标签中找到的证书(即公钥),并确保与 SP 元数据中定义的证书相同。然后使用该证书来验证签名值,该签名值也在<ds:SignatureValue>元素的请求中。如果它验证,那么它会继续使用 AuthnRequest。这是准确的吗?

我错过了什么?

更新 1:我已按照建议添加了日志记录行,以下是 ECP 请求显示的所有内容:

signatureMethodURI = http://www.w3.org/2000/09/xmldsig#rsa-sha1
jceSigAlgorithm    = SHA1withRSA
jceSigProvider     = SunRsaSign
PublicKey = Sun RSA public key, 2048 bits
  modulus: <long value here>
  public exponent: 65537
Signature verification failed.

需要注意的一点是,如果我通过浏览器向我的 SP 发出请求并且我没有登录,我会按预期重定向到我的 IdP 登录页面。我检查 IdP 日志,发现该请求也已签名并验证。我查看了从 SP 发送到 IdP 的表单数据,发现它AuthnRequest也是使用相同的证书签名的,但SignatureValue值当然不同。非 ECP 请求数据 XML 看起来与 ECP 请求 SOAP XML 非常相似,但 ECP 失败了。

更新 2:我正在使用 spring-security-saml-1.0.0.RELEASE 和 Shibboleth IdP v2.4.0。这是我发送给 IdP 的示例消息:

<?xml version="1.0" encoding="UTF-8"?>
<soap11:Envelope 
    xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">
    <soap11:Header>

        </soap11:Header>
        <soap11:Body>
            <saml2p:AuthnRequest 
                xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" AssertionConsumerServiceURL="http://1XP21VRS.mydomain.com:8080/proofofconceptapp-sso/saml/SSO/alias/conceptSSO" ForceAuthn="false" ID="a3j6fd01d0ciahe25b56i326bhe212" IsPassive="false" IssueInstant="2014-10-24T19:37:43.207Z" ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:PAOS" Version="2.0">
                <saml2:Issuer 
                    xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">http://1XP21VRS.mydomain.com:8080/proofofconceptapp-sso
                </saml2:Issuer>
                <ds:Signature 
                    xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
                    <ds:SignedInfo>
                        <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                        <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
                        <ds:Reference URI="#a3j6fd01d0ciahe25b56i326bhe212">
                            <ds:Transforms>
                                <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
                                <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                            </ds:Transforms>
                            <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                            <ds:DigestValue>mMJbjpmWr6OMP9eU70RA9TtfXGY=</ds:DigestValue>
                        </ds:Reference>
                    </ds:SignedInfo>
                    <ds:SignatureValue>I6rHpgjWgl5l5sjst+VHuSUnjUaOBnPIbUrWwcAfdTDSFY2wxUuNdHpXt/YqBfP9ZKdTWZV1IjbTR666T7sa1bZawgT3UO07FoBVAc5z+AH0nCvIz+UNSqpunPTaEdUhSaGmNHSItvFtvz2fDmvZl18GwXrTz4g6vvxKkdo/FijgvYldfYYuO+obcjof1SJmpOOr1iRNvpyGQMxcaH9e07QfJO9SDcLP2elvPvwbJsGGl/n/3sIG+kIm0MECU3hv/4pLx6+SyHDXjdhdOD2HyxGL1t7iIYG1AaDX4dkIt2wH2WOyzhfO2MyykqChhRcYWFdEdgqaQW/IBLPxsVjN9g==</ds:SignatureValue>
                    <ds:KeyInfo>
                        <ds:X509Data>
                            <ds:X509Certificate>MIIDUjCCAjqgAwIBAgIEUOLIQTANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQGEwJGSTEQMA4GA1UE
CBMHVXVzaW1hYTERMA8GA1UEBxMISGVsc2lua2kxGDAWBgNVBAoTD1JNNSBTb2Z0d2FyZSBPeTEM
MAoGA1UECwwDUiZEMQ8wDQYDVQQDEwZhcG9sbG8wHhcNMTMwMTAxMTEyODAxWhcNMjIxMjMwMTEy
ODAxWjBrMQswCQYDVQQGEwJGSTEQMA4GA1UECBMHVXVzaW1hYTERMA8GA1UEBxMISGVsc2lua2kx
GDAWBgNVBAoTD1JNNSBTb2Z0d2FyZSBPeTEMMAoGA1UECwwDUiZEMQ8wDQYDVQQDEwZhcG9sbG8w
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCXqP0wqL2Ai1haeTj0alwsLafhrDtUt00E
5xc7kdD7PISRA270ZmpYMB4W24Uk2QkuwaBp6dI/yRdUvPfOT45YZrqIxMe2451PAQWtEKWF5Z13
F0J4/lB71TtrzyH94RnqSHXFfvRN8EY/rzuEzrpZrHdtNs9LRyLqcRTXMMO4z7QghBuxh3K5gu7K
qxpHx6No83WNZj4B3gvWLRWv05nbXh/F9YMeQClTX1iBNAhLQxWhwXMKB4u1iPQ/KSaal3R26pON
UUmu1qVtU1quQozSTPD8HvsDqGG19v2+/N3uf5dRYtvEPfwXN3wIY+/R93vBA6lnl5nTctZIRsyg
0Gv5AgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAFQwAAYUjso1VwjDc2kypK/RRcB8bMAUUIG0hLGL
82IvnKouGixGqAcULwQKIvTs6uGmlgbSG6Gn5ROb2mlBztXqQ49zRvi5qWNRttir6eyqwRFGOM6A
8rxj3Jhxi2Vb/MJn7XzeVHHLzA1sV5hwl/2PLnaL2h9WyG9QwBbwtmkMEqUt/dgixKb1Rvby/tBu
RogWgPONNSACiW+Z5o8UdAOqNMZQozD/i1gOjBXoF0F5OksjQN7xoQZLj9xXefxCFQ69FPcFDeEW
bHwSoBy5hLPNALaEUoa5zPDwlixwRjFQTc5XXaRpgIjy/2gsL8+Y5QRhyXnLqgO67BlLYW/GuHE=</ds:X509Certificate>
                        </ds:X509Data>
                    </ds:KeyInfo>
                </ds:Signature>
            </saml2p:AuthnRequest>
        </soap11:Body>
    </soap11:Envelope>

我几乎只是将初始 PAOS 请求的响应复制到 SP(Spring SAML),删除标头内部,并将其发送到 Shibboleth IdP。我发送的标题是:

Content-Type: text/xml
Authorization: Basic <base64 encoded credential string here>

更新 3:签名的非 ECP AuthnRequests 验证就好了。因此,对于签名失败的 IdP,只有 SOAP ECP AuthnRequests。有任何想法吗?

更新 4:仍然无法正常工作。任何帮助,将不胜感激。

4

0 回答 0