Ne XML İmzalar SAML çalışma almak hakkında bilmeniz gerekenler nelerdir?

2 Cevap php

Işte biz SAML tarafından doğrulandığı Single Sign On kullanarak başka bir şirketin web uygulaması ile arayüz gerekir bir web uygulaması var. Bizim web uygulamaları PHP ile yazılmış, ve diğer şirket kullanarak hangi dil seçimi açıkça alakasız edilir. Yine de, ben bu diğer şirket SAML istekleri ile SOAP istekleri göndermek basit bir API yazmak, ve bir SAML yanıtı geri oluşturmak için gerekli ettik. 1) gerçekten ben bir, 2) bu sınırlar istedim bile PHP ile yazılmış SAML etkileşimler için birçok seçenek var gibi görünüyor değil mi: Ben üç nedenden dolayı sıfırdan yazıyorum başka bir üçüncü taraf bileşen ekleyerek, ve 3) sıfırdan bir şeyler oluşturma ile ilgili olacaktır havai genellikle önemli ölçüde daha iyi bir anlayış ile beni bırakır ve bana çok daha yetenekli gerekirse gelecekte şeyi uyum yapar.

Her neyse, ben SAML, SOAP, ve genel olarak XML standartları için oldukça yeni, bu yüzden ben gitmek gibi bir tür kendimi öğretim oldum. Ben diğer şirket bizim tepki dijital bir sertifika (ve aldığımız istek benzer dijital olarak imzalanmış olacaktır) ile imzalanmış olması gerekmektedir belirtildi olduğu bir istisna dışında, hemen hemen tam bizim amaçlı API var. Yani XML imza oluşturmak / işlemek için nasıl anlamaya çalışıyorum, ama W3C özellikleri tam olarak ışık okuma değil gibi dürüstçe tüm biraz kafa karıştırıcı.

Assertions and Protocol for the OASIS Security Markup Language (SAML) V1.1 belge (diğer şirket onlar v1.1 kullanarak olacak dedi belge Ben kapalı devam ettik) Bölüm 5.4.8, imzalı bir iddiayı içeren imzalı bir yanıt bir örnek içermektedir Hangi ben referans için buraya eklemek için gidiyorum:

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

Peki nasıl böyle bir şey oluşturabilir mi? Ben böyle bir şey alırsanız, nasıl bunu doğrulamak mı? Ayrıca, herkes <ds:Signature> etiketleri burada ne sadece bir temel kavramsal bir bakış sunabilir? İki <ds:Signature> etiketler, ana <Response> biri ve <Assertion> biri, kendi <ds:DigestValue> ihtiva eden, her biri {var gibi görünüyor [(5)]} ve <ds:X509Certificate> (ve her biri ayrı). Nasıl bu üretilir? Bu kulübe herhangi bir ışık çok takdir edilecektir. Öğreticiler veya kod örnekleri daha fazla duyacağız! Sadece bana doğru yolda alabilirsiniz Ama eğer bu noktada, ben gerçekten soruyorum hepsi. Şu anda tüm hala benim için büyük bir kara kutu gibi görünüyor.

Bu yardımcı olur arada, bu SAML uygulamaları "Exclusive Kurallı" yöntemi yalnızca (tar-C14N) kullanmalı ve sadece "dönüştürmek zarflı" kullanması gerektiğini başka saml 1.1 spec diyor. Ben hala ne anlama geldiğini tam olarak emin değilim.

2 Cevap

XML imzalarının işleme XML ile çok aşina iseniz, gerçekten çok zor değil, ama kesinlikle doğru ya da işler yok olması ayrıntıları bir yeri vardır, bu yüzden muhtemelen bu benim kendi uygulama yazma deneyin olmaz durum (Kısmen kez uygulamak yaptım, ama bu farklı ve özel bir amaç için, ve yine tam bir uygulama değildi).

Neyse, belki ben sizin sorularınızı cevaplamak için deneyerek size bazı yol alabilirsiniz, ben SAML hakkında çok şey bilmiyorum, ama ben XML ve XML İmzalar hakkında biliyorum.

A Signature eleman dijital olarak SignedInfo çocuk eleman, imzalanmış bir XML belgesinin belirli bir parça anlamına gelir. Bu bir Reference çocuk eleman (I imzalanacak bayt oluşturulurken Zincirleme olsun birçok Reference unsurlar olabilir düşünüyorum ama artık emin hatırlamıyorum) puan URI özniteliği aracılığıyla içeriği. Transform elemanları içeriğine atıfta-öncesinde bunu karma üzerinde gerçekleştirilmiştir dönüşümleri tarif etmektedir; Eğer dönüşüm algoritmaları nasıl tanımlandığına anlamaya özelliklerine bakmak gerekir. DigestMethod elemanı (bunlardan biri her zaman bayt içine XML dönüştürür kurallı olduğunu unutmayın) bu dönüşüm algoritmaların sonucudur bayt uygulamak için karma algoritması verir, ve {[(7)] } sindirmek algoritmanın sonucu verir.

Gerçek imza SignatureValue elemanı ve bayt üretmek için CanonicalizationMethod elemanın kurallı uygulayarak ve daha sonra SignatureMethod bu bayt imza tarafından üretilmektedir. KeyInfo eleman kullanmak için anahtarı bulmak için nasıl söyler.

Birkaç kez üzerinde görünür Kurallı, sadece "eşdeğer" XML belgeleri aynı bayt dizisi üretmek o kadar bayt içine bir XML belgesi dönüştürmek için bir yoldur. Algoritmalar bayt üzerinde çalışmak ve XML muhtemelen orijinal bayt bozacak ama denkliğini korur aracıların bir dizi geçecek, çünkü bu dijital imza gereklidir. Ve farklı kurallı yöntemler, farklı durumlar için gereklidir: elemanları belgelerden çıkarılan ve diğerleri içine yerleştirilir eğer, gereksiz ad tanımları şeritler uzakta özel kanonikleştirme gerekir, ancak diğer durumlarda bu düzgün çalışmayabilir, bu nedenle yerine dahil kanonikleştirme gerekir ki tüm kapsam ad korur.

Bu sadece temelidir. Orada bir XML imza üretmek için nasıl farklı seçenekler vardır ve bir çalışma doğrulayıcı uygulamak istiyorsanız, hepsini dikkate almak gerekir. Genel XML için yeni olduğundan, ben sadece zaten var bir şey kullanarak benim tavsiye tekrar edeceğiz. Bu şartname uygulamak için ilginç bir öğrenme deneyimi, ama uygulamalar mevcut olup olmadığını sık sık bir zaman kaybıdır.

Bir örnek SimpleSAML içinde xmlseclibs.php içinde var. Bu kripto yapmak için openssl modül dayanır.

Birlikte çalışabilirlik sorunları olduğu debug potansiyel gerekir kadar gelebilir çünkü sadece ben dürüst, java / tomcat o lib veya köprü kullanırsınız