Domanda

Al lavoro abbiamo una web app che avremo bisogno di interfacciarsi con un'altra società di web app utilizzando Single Sign On validato da SAML. Le nostre applicazioni web sono scritte in PHP, ed è ovviamente irrilevante quale lingua scelta l'altra società sta usando. Tuttavia, ho bisogno di scrivere una semplice API che questa azienda può inviare richieste SOAP con le richieste SAML, e generare di nuovo una risposta SAML. Ho scritto da zero per tre motivi: 1) non sembrano davvero essere molte opzioni per le interazioni SAML scritte in PHP, anche se volevo uno, 2) limita l'overhead che sarebbe coinvolto con l'aggiunta di un altro componente di terze parti, e 3) creazione di cose da zero di solito mi lascia con una conoscenza significativamente migliore e mi fa molto più capace di adattare la cosa in futuro, se necessario.

In ogni modo, io sono abbastanza nuovo per SAML, SOAP, XML e gli standard in generale, così ho tipo di insegnato me come io vado. Ho l'API praticamente completa per i nostri scopi, con la sola eccezione che l'altra società ha precisato che la nostra risposta dovrà essere firmato digitalmente con un certificato (e la richiesta che riceviamo sarà simile sia con firma digitale). Così ho cercato di capire come elaborare / generare le firme XML, ma onestamente è tutto un po 'di confusione, come specifiche del W3C non sono esattamente la lettura della luce.

Sezione 5.4.8 della affermazioni e protocollo per l'OASIS Security Markup Language (SAML) v1.1 documento (il documento vado fuori, come l'altra società ha detto che verrà usato v1.1) include un esempio di una risposta firmata contenente un'affermazione firmata, che ho intenzione di includere qui per riferimento:

<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>

Quindi, come faccio a generare qualcosa di simile? E se ricevo qualcosa di simile, come faccio a convalidarlo? Inoltre, qualcuno può offrire solo una panoramica concettuale di base di ciò che i tag <ds:Signature> sono qui? Sembra che ci siano due tag <ds:Signature>, uno nella <Response> principale e uno in <Assertion>, ciascuna contenente il proprio <ds:DigestValue>, <ds:SignatureValue> e <ds:X509Certificate> (e ogni distinto). Come vengono generati questi? Ogni luce è possibile gettare su questo sarà molto apprezzato. Tutorial o esempi di codice sarebbe ancora più apprezzato! Ma a questo punto, se si può solo farmi sulla strada giusta, questo è tutto quello che sto veramente chiedendo. In questo momento tutto sembra ancora come una grande scatola nera per me.

A proposito, se questo aiuta, si dice in altre parti del SAML 1.1 spec che le implementazioni SAML dovrebbero utilizzare il metodo "Exclusive canonica" solo (escl-C14N) e usano il "avvolgeva trasformare" solo. Io non sono ancora del tutto sicuro di cosa significa.

È stato utile?

Soluzione

firme elaborazione XML non è davvero troppo difficile, se siete molto familiarità con XML, ma ci sono un sacco di dettagli che devono essere assolutamente giusto o le cose non funzionano, quindi probabilmente non sarebbe provare a scrivere il mio implementazione in questa situazione (ho attuare parzialmente una volta, ma che era per uno scopo diverso e speciale, e comunque non era un'implementazione completa).

In ogni caso, io non ne so molto di SAML, ma so su XML e XML Firme, quindi forse posso farti una parte del cammino, cercando di rispondere alle vostre domande.

Un elemento Signature si riferisce ad una parte specifica di un documento XML che è stato firmato digitalmente, nel suo elemento SignedInfo bambino. L'elemento Reference figlio di che (penso che ci possono essere molti elementi Reference che ottengono concatenato al momento della formazione del byte per essere firmato, ma non mi ricordo di sicuro più) punti al contenuto tramite l'attributo URI. Gli elementi Transform descrivono trasformazioni eseguite sul cui-al contenuto prima di hashing; avrete bisogno di guardare le specifiche per capire come vengono definiti gli algoritmi di trasformazione. L'elemento DigestMethod fornisce l'algoritmo hash per applicare ai byte che sono il risultato di tali algoritmi di trasformazione (si noti che uno di loro è sempre canonica che converte XML in byte), e il DigestValue dà il risultato di tale algoritmo digest.

La firma reale è nell'elemento SignatureValue, ed è prodotto applicando canonica dell'elemento CanonicalizationMethod per produrre i byte e poi la firma questi byte con il SignatureMethod. L'elemento KeyInfo ti dice come trovare la chiave da utilizzare.

canonica, che appare un paio di volte in precedenza, è semplicemente un modo per convertire un documento XML in byte in modo che "equivalenti" documenti XML producono la stessa sequenza di byte. Ciò è necessario in una firma digitale perché gli algoritmi lavorano byte e XML può passare attraverso una serie di intermediari che probabilmente disturbare i byte originali, ma mantengono l'equivalenza. E diversi metodi di rappresentazione canonica sono necessari per diverse situazioni: se gli elementi sono estratti da documenti e inseriti in altri, è necessario canonica esclusivo che strappa via le definizioni non necessari namespace, ma in altri casi questo potrebbe non funzionare correttamente, quindi è necessario canonica inclusiva, invece, che conserva namespace tutto in-scope.

Questa è solo le basi. Ci sono una serie di opzioni diverse in modo da produrre una firma XML, e se si desidera implementare un verificatore di lavoro, è necessario considerare tutti loro. Dal momento che sei un nuovo XML in generale, mi limiterò a ripetere il mio consiglio di usare qualcosa che già esiste. Si tratta di un'esperienza di apprendimento interessante per implementare una specifica, ma spesso si tratta di una perdita di tempo, se le implementazioni sono già disponibili.

C'è documentazione sulle firme.

Altri suggerimenti

C'è un esempio in xmlseclibs.php in SimpleSAML . Essa si basa sul modulo OpenSSL per fare il Crypto.

Vorrei sinceramente usare quella lib o ponte per Java / Tomcat, proprio perché i problemi di interoperabilità potrebbero venire che avrebbe bisogno di essere potenzialmente debug,

  1. Si può avere uno sguardo su questo lib Java per firmare la richiesta di SAML esempio https: // github.com/jrowny/java-saml

  2. Per convalidare la firma è necessario installare SAML tracciante addon https://addons.mozilla.org/en-US/firefox/addon/saml-tracer/

  3. È possibile utilizzare lo strumento https://www.samltool.com/validate_logout_req.php a vaalidate o firmare la richiesta https://www.samltool.com/sign_logout_req.php

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top