문제

직장에는 SAML에 의해 검증 된 단일 부호를 사용하여 다른 회사의 웹 앱과 인터페이스 해야하는 웹 앱이 있습니다. 당사의 웹 앱은 PHP로 작성되었으며 다른 회사가 사용하는 언어 선택은 분명히 관련이 없습니다. 그럼에도 불구하고,이 회사가 SAML 요청으로 비누 요청을 보낼 수있는 간단한 API를 작성하고 SAML 응답을 생성해야했습니다. 세 가지 이유로 처음부터 글을 썼습니다. 1) PHP로 작성된 SAML 상호 작용에 대한 많은 옵션이없는 것 같습니다. 2) 다른 타사 구성 요소 추가와 관련된 오버 헤드를 제한하고 3) 처음부터 사물을 만드는 것은 일반적으로 훨씬 더 나은 이해를 얻게되며 필요한 경우 미래에 물건을 적응시킬 수 있습니다.

어쨌든, 나는 일반적으로 Saml, Soap 및 XML 표준을 처음 접했기 때문에 나는 갈 때 나 자신을 가르치고 있습니다. 나는 다른 회사가 우리의 응답에 인증서와 디지털로 서명해야한다는 것을 명시했다는 것을 제외하고는 API를 거의 완료했습니다 (그리고 우리가받는 요청은 비슷하게 디지털 서명). 그래서 나는 XML 서명을 처리/생성하는 방법을 알아 내려고 노력했지만 솔직히 W3C 사양이 정확히 가벼운 판독 값이 아니기 때문에 약간 혼란 스럽습니다.

섹션 5.4.8 오아시스 보안 마크 업 언어 (SAML) v1.1에 대한 주장 및 프로토콜 문서 (다른 회사가 v1.1을 사용할 것이라고 말했듯이 내가 꺼진 문서)에는 서명 된 어설 션이 포함 된 서명 된 응답의 예가 포함되어 있습니다.

<Response IssueInstant="2003-04-17T00:46:02Z" MajorVersion="1" MinorVersion="1"
 Recipient="www.opensaml.org" ResponseID="_c7055387-af61-4fce-8b98-e2927324b306"
 xmlns="urn:oasis:names:tc:SAML:1.0:protocol"
 xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <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="#_c7055387-af61-4fce-8b98-e2927324b306">
    <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#">
      <InclusiveNamespaces PrefixList="#default saml samlp ds xsd xsi"
       xmlns="http://www.w3.org/2001/10/xml-exc-c14n#"/>
     </ds:Transform>
    </ds:Transforms>
    <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
    <ds:DigestValue>TCDVSuG6grhyHbzhQFWFzGrxIPE=</ds:DigestValue>
   </ds:Reference>
  </ds:SignedInfo>
  <ds:SignatureValue>x/GyPbzmFEe85pGD3c1aXG4Vspb9V9jGCjwcRCKrtwPS6vdVNCcY5rHaFPYWkf+5EIYcPzx+pX1h43SmwviCqXRjRtMANWbHLhWAptaK1ywS7gFgsD01qjyen3CP+m3Dw6vKhaq1ed10BYyrIzb4KkHO4ahNyBVXbJwqv5pUaE4=</ds:SignatureValue>
  <ds:KeyInfo>
   <ds:X509Data>
    <ds:X509Certificate>MIICyjCCAjOgAwIBAgICAnUwDQYJKoZIhvcNAQEEBQAwgakxCzAJBgNVBAYTA1VT ... 8I3bsbmRAUg4UP9hH6ABVq4KQKMknxu1xQxLhpR1y1GPdiowMNTrEG8cCx3w/w==</ds:X509Certificate>
   </ds:X509Data>
  </ds:KeyInfo>
 </ds:Signature>
 <Status><StatusCode Value="samlp:Success"/></Status>
 <Assertion AssertionID="_a75adf55-01d7-40cc-929f-dbd8372ebdfc"
  IssueInstant="2003-04-17T00:46:02Z" Issuer="www.opensaml.org"
  MajorVersion="1" MinorVersion="1" xmlns="urn:oasis:names:tc:SAML:1.0:assertion"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Conditions NotBefore="2003-04-17T00:46:02Z" NotOnOrAfter="2003-04-17T00:51:02Z">
   <AudienceRestrictionCondition>
    <Audience>http://www.opensaml.org</Audience>
   </AudienceRestrictionCondition>
  </Conditions>
  <AuthenticationStatement AuthenticationInstant="2003-04-17T00:46:00Z"
   AuthenticationMethod="urn:oasis:names:tc:SAML:1.0:am:password">
   <Subject>
    <NameIdentifier Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">scott@example.org</NameIdentifier>
    <SubjectConfirmation>
     <ConfirmationMethod>urn:oasis:names:tc:SAML:1.0:cm:bearer</ConfirmationMethod>
    </SubjectConfirmation>
   </Subject>
   <SubjectLocality IPAddress="127.0.0.1"/>
  </AuthenticationStatement>
  <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="#_a75adf55-01d7-40cc-929f-dbd8372ebdfc">
     <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#">
       <InclusiveNamespaces PrefixList="#default saml samlp ds xsd xsi"
        xmlns="http://www.w3.org/2001/10/xml-exc-c14n#"/>
      </ds:Transform>
     </ds:Transforms>
     <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
     <ds:DigestValue>Kclet6XcaOgOWXM4gty6/UNdviI=</ds:DigestValue>
    </ds:Reference>
   </ds:SignedInfo>
   <ds:SignatureValue>hq4zk+ZknjggCQgZm7ea8fI79gJEsRy3E8LHDpYXWQIgZpkJN9CMLG8ENR4Nrw+n7iyzixBvKXX8P53BTCT4VghPBWhFTSt9tHWu/AtJfOTh6qaAsNdeCyG86jmtp3TDMWuL/cBUj2OtBZOQMFn7jQ9YB7k1Iz3RqVL+wNmeWI4=</ds:SignatureValue>
   <ds:KeyInfo>
    <ds:X509Data>
     <ds:X509Certificate>MIICyjCCAjOgAwIBAgICAnUwDQYJKoZIhvcNAQEEBQAwgakxCzAJBgNVBAYTA1VT ... 8I3bsbmRAUg4UP9hH6ABVq4KQKMknxu1xQxLhpR1y1GPdiowMNTrEG8cCx3w/w==</ds:X509Certificate>
    </ds:X509Data>
   </ds:KeyInfo>
  </ds:Signature>
 </Assertion>
</Response>

그렇다면 어떻게 이와 같은 것을 생성합니까? 그리고 이와 같은 것을 받으면 어떻게 검증합니까? 또한 누구나 누구나 무엇을 <ds:Signature> 태그가 여기 있습니다? 두 개가있는 것 같습니다 <ds:Signature> 메인에있는 태그 <Response> 그리고 하나는 <Assertion>, 각각 자신의 것을 포함합니다 <ds:DigestValue>, <ds:SignatureValue>, 그리고 <ds:X509Certificate> (그리고 각각의 뚜렷한). 이것들은 어떻게 생성됩니까? 당신이 이것에 흘릴 수있는 모든 빛은 대단히 감사 할 것입니다. 튜토리얼 또는 코드 예제는 더욱 높이 평가 될 것입니다! 그러나이 시점에서, 당신이 나를 올바른 길로 데려 갈 수 있다면, 그것이 내가 정말로 요구하는 전부입니다. 지금 당장 모든 것이 여전히 나에게 큰 블랙 박스처럼 보입니다.

그건 그렇고, 이것이 도움이된다면, SAML 1.1 사양의 다른 곳에서 SAML 구현은 "독점 정식화"방법 만 사용해야하며 (독점 C14N) "Enveloped Transform"만 사용해야한다고 말합니다. 나는 그게 무엇을 의미하는지 아직 확실하지 않습니다.

도움이 되었습니까?

해결책

XML 서명을 처리하는 것은 XML에 매우 익숙하다면 너무 어렵지 않지만 절대적으로 옳거나 일이 작동하지 않아야 할 세부 사항이 많기 때문에 아마도 내 자신의 구현을 작성하려고하지 않을 것입니다. 상황 (나는 부분적으로 한 번 구현했지만, 그것은 다르고 특별한 목적을위한 것이었고 어쨌든 그것은 완전한 구현이 아니었다).

어쨌든, 나는 SAML에 대해 많이 알지 못하지만 XML 및 XML 서명에 대해 알고 있으므로 질문에 답변하여 몇 가지 방법을 얻을 수 있습니다.

Signature 요소는 디지털로 서명 된 XML 문서의 특정 부분을 나타냅니다. SignedInfo 어린이 요소. 그만큼 Reference 그 자식 요소 (많은 사람들이있을 수 있다고 생각합니다 Reference 서명 할 바이트를 형성 할 때 연결되는 요소는 더 이상 확실하지 않습니다.) URI 기인하다. 그만큼 Transform 요소는 해싱 전에 참조-투 컨텐츠에 대해 수행 된 변환을 설명합니다. 변환 알고리즘이 어떻게 정의되는지 알아 보려면 사양을 살펴 봐야합니다. 그만큼 DigestMethod 요소는 해시 알고리즘이 이러한 변환 알고리즘의 결과 인 바이트에 적용 할 수 있도록 제공합니다 (그 중 하나는 항상 XML을 바이트로 변환하는 정식화). DigestValue 해당 다이제스트 알고리즘의 결과를 제공합니다.

실제 서명이 있습니다 SignatureValue 요소 및 적용하여 생성됩니다 CanonicalizationMethod 바이트를 생성 한 다음이 바이트에 서명하기위한 요소의 정식화 SignatureMethod. 그만큼 KeyInfo 요소는 사용할 키를 찾는 방법을 알려줍니다.

위의 두 번 나타나는 정식화는 단순히 "동등한"XML 문서가 동일한 시퀀스의 바이트를 생성하도록 XML 문서를 바이트로 변환하는 방법입니다. 알고리즘이 바이트에서 작동하고 XML은 원래 바이트를 방해하지만 동등성을 유지할 수있는 여러 중개자를 통과 할 수 있기 때문에 디지털 서명에서 필요합니다. 그리고 다른 상황에 따라 다른 정식화 방법이 필요합니다. 요소가 문서에서 추출되어 다른 사람에 배치되면 불필요한 네임 스페이스 정의를 제거하는 독점적 인 정식화가 필요하지만, 다른 경우에는 올바르게 작동하지 않을 수 있으므로 대신 포괄적 인 표준화가 필요합니다. 모든 스코프 내 네임 스페이스를 보존합니다.

이것은 단지 기본입니다. XML 서명을 생성하는 방법에는 여러 가지 옵션이 있으며 작업 검증자를 구현하려면 모든 것을 고려해야합니다. 당신은 일반적으로 XML을 처음 사용하기 때문에 이미 존재하는 것을 사용하는 것에 대한 조언을 반복 할 것입니다. 사양을 구현하는 것은 흥미로운 학습 경험이지만 구현이 이미 사용 가능한 경우 시간 낭비입니다.

W3C가 있습니다 선적 서류 비치 서명에 대해.

다른 팁

xmlseclibs.php in에는 예가 있습니다 simplesaml. 암호화를 수행하기 위해 OpenSSL 모듈에 의존합니다.

나는 잠재적으로 디버깅 해야하는 인터 로프 문제가 발생했을 수 있기 때문에 그 lib 또는 bridge to java/tomcat에 솔직히 사용합니다.

  1. 이 Java Lib를 살펴 보려면 SAML 요청 예제에 서명 할 수 있습니다. https://github.com/jrowny/java-saml

  2. 서명을 확인하려면 Saml Tracer Addon을 설치해야합니다. https://addons.mozilla.org/en-us/firefox/addon/saml-tracer/

  3. 도구를 사용할 수 있습니다 https://www.samltool.com/validate_logout_req.php 요청을 vaalidate 또는 서명하기 위해 https://www.samltool.com/sign_logout_req.php

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top