Uygun xml özel kurallı hangisi?

2 Cevap php

I xmlseclibs bir soap belgeyi denemek ve imzalamak için kullanıyorum, ama ben imzalama veya doğrulayarak ediyorum bağlı olarak aynı şekilde şeyler meşrulaştırılmaz görünmüyor.

Size bir örnek vereyim. Bu benim imzalamak için çalışıyorum XML:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" MajorVersion="1" MinorVersion="1" IssueInstant="2010-02-04T15:27:43Z" ResponseID="pfxe85313e6-e688-299a-df06-30f55e24f65a">
<samlp:Status>
<samlp:StatusCode Value="samlp:Requester"/>
</samlp:Status>
</samlp:Response>
</soapenv:Body>
</soapenv:Envelope>

Bazı kod ortak anahtar ve özel anahtar sertifikalarının bir arada kullanarak imzalamak için PHP çalışma var, ve o iş gibi görünüyordu. Tüm uygun malzeme ile <ds:Signature> unsuru ekledi ve büyük görünüyordu. Ama sonra hemen xmlseclibs (ve ortak anahtar sertifikası) ile tekrar, bunu imzaladıktan sonra doğrulamak için çalışıyoruz bunu test, ancak doğrulama başarısız oldu. Yani aynı kod kütüphanesi imzalama ve geçerlilik hem de yapıyor, ancak iki süreç nedense kabul etmiyorum.

Ben ne yaptığını öğrenmek için xmlseclibs için bazı hata ayıklama kodu eklenmiş, ve ben bu iki durum farklı şeyler kanonlaştırır çünkü imzalama anahtarı ile geliyor ve doğrulama anahtarı ile geliyor nedeni farklıdır olduğunu fark etti. Ben <samlp:Response> elemanı imzalamak için bunu söylemek, bu kanonik formu işaretleri (ben okunabilmesi için buraya satırsonlarını ekledim) 'dir:

<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" IssueInstant="2010-02-04T15:27:43Z" MajorVersion="1" MinorVersion="1" ResponseID="pfxe85313e6-e688-299a-df06-30f55e24f65a" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion">
<samlp:Status>
<samlp:StatusCode Value="samlp:Requester">
</samlp:StatusCode>
</samlp:Status>
</samlp:Response>

O imzayı doğrulamak için gittiğinde Ancak, bu (yine burada, ben ekledim satırsonlarının) karşı doğrulamak için hesaplar kanonik şeklidir:

<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" IssueInstant="2010-02-04T15:27:43Z" MajorVersion="1" MinorVersion="1" ResponseID="pfxe85313e6-e688-299a-df06-30f55e24f65a">
<samlp:Status>
<samlp:StatusCode Value="samlp:Requester">
</samlp:StatusCode>
</samlp:Status>
</samlp:Response>

Ilk yok iken Yani gördüğünüz gibi, bu sürüm, <samlp:Response> öğeden xmlns:saml niteliğini atlar. (Bu, hem de içerdiği xmlns:samlp niteliğinin farklı olduğunu unutmayın.) Bu xmlseclibs bir hata gibi oldukça net görünüyor, ama yine de ben sadece bilseydim kendimi düzeltmek için mutlu olurdu biri hangi kanonik formu doğru biriydi. Bu özellik özel kurallı tarafından atlanmış mıdır? Ya da dahil edilmelidir? Doğru seçkin kanonik hangisi?

2 Cevap

Sen yanlış DOM belgesi oluşturma ve geçersiz bellek ağacını kullanmak için çalışıyoruz. Serialize ve tefrika sonuç kullanmak veya düzgün oturum açmadan önce ağacında alanı bildirimleri oluşturun ya. Daha fazla bilgi için hata raporuna bakın: http://code.google.com/p/xmlseclibs/issues/detail?id=6

Ne doğru kanonik form vardır!

Imza XML olmayan ad Belge Sipariş kuralı çiğnemesini, nitelikleri sonra gelen bir isim alanı bildirimi vardır:

Namespace düğümleri öznitelik düğümleri daha az belge düzeni pozisyon var.

Doğrulama XML tamamen saml namespace düğümü eksik. Onlara başvuran hiçbir çocuğun içerik yoktur çünkü Canonicalisation sadece isim-alanı düğümleri kaldırmaz. Sadece gereksiz ad düğümleri (ebeveyn üzerindeki etkisi zaten vardı yani ad alanları) kaldırır.

Ben bu neden oluyor demek xmlseclibs hakkında yeterli bilmiyorum, ama hem sayıları kesinlikle yanlış. FWIW burada benim DOM c14n fonksiyonu diyor ki:

<samlp:Response xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" IssueInstant="2010-02-04T15:27:43Z" MajorVersion="1" MinorVersion="1" ResponseID="pfxe85313e6-e688-299a-df06-30f55e24f65a">
<samlp:Status>
<samlp:StatusCode Value="samlp:Requester"></samlp:StatusCode>
</samlp:Status>
</samlp:Response>

eta: Ben sadece SVN'de xmlseclibs.php baktı ve geçerli bir yaklaşım olarak, bu kolay bir düzeltme vardır temelde kusurlu değil bu. Bu bir "canonicalised" DOM ​​oluşturmak için çalışır ve daha sonra düz eski ile serialises saveXML(). Nitelik düzeni ve karakteri hakkında C14N serileştirme kuralları saveXML takip etmek için söz etmez kaçar olduğu gibi, bu muhtemelen çalışabilir yolu yoktur.