[certificate] SAML : 인증서가 서명 내에있는 이유는 무엇입니까?

회사 웹 사이트 (신뢰 당사자)에 대해 SAML을 사용하여 SSO를 구현해야합니다. 과정에서 필수적인 부분은 서명 확인입니다. 다음은 파트너 회사 (어설 션 당사자)의 샘플 SAML 서명 부분입니다.

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
 <ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
  <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
  <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
  <ds:Reference URI="#_2152811999472b94a0e9644dbc932cc3" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
   <ds:Transforms xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
    <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
     <ec:InclusiveNamespaces PrefixList="ds saml samlp xs" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/>
    </ds:Transform>
   </ds:Transforms>
   <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"/>
   <ds:DigestValue xmlns:ds="http://www.w3.org/2000/09/xmldsig#">bW1Os7+WykqRt5h0mdv9o3ZF0JI=</ds:DigestValue>
  </ds:Reference>
 </ds:SignedInfo>
 <ds:SignatureValue xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
cgrAN4T/UmobhrkkTi3miiRfbo0Z7aakSZjXuTWlZlu9jDptxPNbOFw8ZbYKZYyuW544wQqgqpnG
gr5GBWILSngURjf2N45/GDv7HMrv/NRMsRMrgVfFsKbcAovQdLAs24O0Q9CH5UdADai1QtDro3jx
nl4x7HaWIo9F8Gp/H1c=
 </ds:SignatureValue>
 <ds:KeyInfo>
  <ds:X509Data>
   <ds:X509Certificate>MIIElzCCA3+gAwIBAgIQNT2i6HKJtCXFUFRB8qYsZjANBgkqhkiG9w0BAQUFADB3MQswCQYDVQQG
    EwJGUjEOMAwGA1UEBxMFUGFyaXMxDDAKBgNVBAoTA3BzYTEgMB4GA1UECxMXY2VydGlmaWNhdGUg
    YXV0aG9yaXRpZXMxKDAmBgNVBAMTH0FDIFBTQSBQZXVnZW90IENpdHJvZW4gUHJvZ3JhbXMwHhcN
    MDkwODE5MDcxNTE4WhcNMTEwODE5MDcxNTE5WjCBhjELMAkGA1UEBhMCZnIxHzAdBgkqhkiG9w0B
    CQEWEHBhc3NleHRAbXBzYS5jb20xGDAWBgoJkiaJk/IsZAEBEwhtZGVtb2IwMDEMMAoGA1UEChMD
    cHNhMREwDwYDVQQLEwhwcm9ncmFtczEbMBkGA1UEAxMSVGVzdCAtIFBBU1NFWFQgREVWMIGfMA0G
    CSqGSIb3DQEBAQUAA4GNADCBiQKBgQCuY1nrepgACvDSTLWk5A1cFOJSwDbl6CWfYp3cNYR0K3YV
    e07MDZn+Rv4jo3SusHVFds+mzKX2f8AeZjkA3Me/0yiS9UpS9LQZu9mnhFlZRhmUlDDoIZxovLXN
    aOv/YHmPeTQMQmJZu5TjqraUq7La1c187AoJuNfpxt227N1vOQIDAQABo4IBkTCCAY0wDgYDVR0P
    AQH/BAQDAgWgMB8GA1UdIwQYMBaAFLceWtTfVeRuVCTDQWkmwO4U01X/MAwGA1UdEwEB/wQCMAAw
    gbYGA1UdIASBrjCBqzCBqAYKKoF6ARfOEAEBBDCBmTBBBggrBgEFBQcCARY1aHR0cDovL3JldW5p
    cy5pbmV0cHNhLmNvbS9hdXRvcml0ZS9QQy1BQy1Qcm9ncmFtcy5wZGYwVAYIKwYBBQUHAgIwSDAK
    FgNwc2EwAwIBARo6UG9saXRpcXVlIGRlIENlcnRpZmljYXRpb24gQUMgUFNBIFBldWdlb3QgQ2l0
    cm9lbiBQcm9ncmFtczBcBgNVHR8EVTBTMFGgT6BNhktodHRwOi8vaW5mb2NlcnQucHNhLXBldWdl
    b3QtY2l0cm9lbi5jb20vQUMtUFNBLVBldWdlb3QtQ2l0cm9lbi1Qcm9ncmFtcy5jcmwwHQYDVR0l
    BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBYGA1UdDgQPBA1BVVRPX0dFTkVSQVRFMA0GCSqGSIb3
    DQEBBQUAA4IBAQCvRtP6bFkOUEHcqc6yUX0Q1Gk2WaAcx4ziUB0tw2GR9I0276JRJR0EGuJ/N6Fn
    3FhLQrSPmS97Xvc9XmiI66fQUdg64g9YqBecdiQlUkR20VLgI6Nq8pldQlWjU2iYlkP15U7VF4Qr
    0Pb2QiIljZUCKdv3qdED2Ri33za46LfykrlwZB0uhTVUxI/AEtjkKVFaZaqanJg+vJyZI5b30z7g
    Ff8L3ht4Z7SFKdmY3IQSGzElIAAUfduzTJX0cwnGSU9D4BJu1BS8hWnYPwhk+nBJ7OFhXdwYQFWq
    fhpBLq+ciJti9OMhcdCSIi0PbrOqzqtX7hZUQOvfShhCTJnl5TJJ</ds:X509Certificate>
  </ds:X509Data>
 </ds:KeyInfo>
</ds:Signature>

내가 이해하지 못하는 것은 왜 인증서가 서명 안에 있다는 것입니까?

저는 보통 안전한 방식으로 회사로부터 인증서를 받기 때문에 인증서가 그들로부터 온다는 것을 압니다. 그리고 서명 확인이 성공하면 파트너 회사가 서명 한 것을 압니다.

그러나 인증서가 SAML-Response의 서명 내에 있으면 누구나 인증서를 보낼 수 있습니다! 내가 아는 유일한 것은 응답이 위조되지 않았다는 것입니다. 하지만 요점은 누가 SAML을 보냈는지 모르겠다는 것입니다.

누구든지 저에게 어떻게 작동하는지 설명 할 수 있습니까?



답변

SAML 응답은 해당 서명에 대한 서명 및 공개 키와 함께 제공됩니다.

공개 키를 사용하여 SAML 응답의 내용이 키와 일치하는지 확인할 수 있습니다. 변조.

어떤 기술을 사용하고 있는지 모르겠지만 .Net에서는 다음과 같이 확인할 수 있습니다.

// load a new XML document
var assertion = new XmlDocument { PreserveWhitespace = true };
assertion.LoadXml("The SAML XML that you were sent");

// use a namespace manager to avoid the worst of xpaths
var ns = new XmlNamespaceManager(assertion.NameTable);
ns.AddNamespace("samlp", @"urn:oasis:names:tc:SAML:2.0:protocol");
ns.AddNamespace("asrt", @"urn:oasis:names:tc:SAML:2.0:assertion");
ns.AddNamespace("dsig", @"http://www.w3.org/2000/09/xmldsig#");

// get nodes down to the signature
var responseNode = assertion.SelectSingleNode("/samlp:Response", ns);
var assertionNode = responseNode.SelectSingleNode("asrt:Assertion", ns);
var signNode = assertionNode.SelectSingleNode("dsig:Signature", ns);

// load the XML signature
var signedXml = new SignedXml(assertion.DocumentElement);
signedXml.LoadXml(signNode as XmlElement);

// get the certificate, basically:
//     signedXml.KeyInfo[0].Certificates[0]
// ...but with added casting
var certificate = GetFirstX509Certificate(signedXml);

// check the key and signature match
bool isSigned = signedXml.CheckSignature(certificate, true);

그것은 메시지가 그것이 말하는 사람의 메시지인지 확인합니다. 신뢰할 수있는 사람이 보낸 메시지인지 확인해야하며이 확인 속도는 더 느립니다. 해지를 포함해야하며 전체 인증서 체인을 확인해야 할 수도 있습니다.

일반적으로 이것은 SAML 응답을 수락 할 공개 키 목록입니다.

그런 다음이 메시지가 변조되지 않았고 신뢰할 수있는 사람이 보낸 것인지 확인할 수 있으므로 제공된 SAML 속성에 제공된 사용자 세부 정보를 승인 할 수 있습니다.

당신은 할 수 이미 서명이 다시 공개 키를 포함 할 필요가 없습니다 의미, 공개 키를 가지고 있지만, 당신은 또한 여러 가능한 보내는 사람, 또는 발송인의 체인을 가질 수 있습니다.

예를 들어 신뢰할 수있는 공급자가 두 개있을 수 있습니다. 두 경우 모두 두 공급자를 신뢰하는지 확인하기 전에 메시지가 변조되지 않았는지 확인합니다. 키가 서명에 없으면 어설 션이 조금 더 작을 수 있지만 이제 어설 션이 어떤 ID 공급자에서 왔는지 미리 알아야합니다.

따라서 실제로 공개 키가 서명에있는 두 가지 주요 이유가 있습니다.

  1. 변조 확인은 신원 확인보다 빠르며 공개 키가 알려진 경우 격리 할 수 ​​있습니다.
  2. 키가 어설 션에 있으면 다중 ID를 지원하기가 훨씬 쉽습니다.

답변

키가 지정되는 이유는 아이덴티티 공급자의 메타 데이터가 여러 서명 키를 지정할 수 있고 서명과 함께 포함하여 사용할 키를 지정할 수 있기 때문입니다. SAML 2.0에서는 키가로 지정되지 않은 경우 Assertion컨텍스트 (어설 션 당사자의 메타 데이터에서)에 의해 추론 될 수 있어야합니다.

예를 들어, 어설 션 당사자의 메타 데이터에 다음이있을 수 있습니다.

        <KeyDescriptor>
        <ds:KeyInfo>
            <ds:X509Data>
                <ds:X509Certificate>
BQUAMCMxITAfBgNVBAMTGGlkcDEudGFuZ29oZWFsdGhkZW1vLmNvbTAeFw0xMzA1
...snip...
ttHq2Wi5J7img1M2zo28hH5DK78S+XerfXHK2HEZYZs=
                </ds:X509Certificate>
            </ds:X509Data>
            <ds:X509Data>
                <ds:X509Certificate>
H24a88h7zlq+pnAxQm0CAwEAAaN3MHUwVAYDVR0RBE0wS4IYaWRwMS50YW5nb2hl
...snip...
mg1M2zo28hH5DK78=
                </ds:X509Certificate>
            </ds:X509Data>
        </ds:KeyInfo>
    </KeyDescriptor>

서명 된 각 XML 요소는 서명에 사용되는 키를 지정할 수 있습니다. 그러나 SAML 2.0의 경우 해당 서명 키는 (예를 들어) 서명을 생성하는 당사자의 메타 데이터에 정의 된 것과 일치해야합니다. 서명과 함께 제공된 키를 신뢰할 수없는 경우 (이 경우 메타 데이터에 지정되지 않음) SAML 시스템은 서명을 확인할 때 오류를 생성해야합니다.


답변

서명 인증서의 공개 부분은 SAML 메시지에 있습니다. 이것은 토큰 자체의 서명을 확인하고 물론 수신자가 토큰을 발행 한 사람을 알리고 그에 따라 처리 할 수 ​​있도록하는 데 사용됩니다.

그것이 XML 디지털 서명 사양의 일부라는 사실은 실제로 SAML과 관련된 것이 아닙니다. 인증서가 없으면 토큰의 출처를 어떻게 알 수 있으며 어떻게 유효성을 검사 할 수 있습니까?

XmlDSig는 다른 방법을 지정합니다. 주체, 일련 번호, 해시 등으로 서명 키를 식별 할 수 있지만 이는 수신 당사자가 공용 인증서를 가지고 있다고 가정합니다. SAML의 경우 그렇지 않을 수 있으므로 X509 인증서의 공개 부분이 포함됩니다.


답변