Voi nota câteva caracteristici ale formatului XMLDSig:
2. Diferitele părți ale documentului XML pot fi semnate de mai mulți executori.
3. Semnătura XML poate fi la diferite nivele în raport cu obiectul semnat:
- structura semnăturii poate conține un URI (identificator de resurse unificat);
- Semnătura XML poate fi egală cu nodul abonat;
- O semnătură bazată pe XML poate locui în cadrul gazdei care este semnat;
- Un nod semnat poate locui într-o structură de semnătură XML.
4. Pentru a verifica validitatea EP, este necesar accesul la obiectul de semnare.
Structura SOAP-sub acoperire
În general, mesajul constă dintr-un antet și un corp: Header and Body. Antetul conține metadate și datele corpului. Semnătura XML este plasată în nodul Header.
Algoritmi criptografici și canonicalizare.
Datorită flexibilității regulilor pentru compilarea XML, aceeași structură a documentului și aceeași informație pot fi reprezentate prin diferite documente XML. Luați în considerare două documente:
Din punct de vedere logic, ele sunt echivalente, adică au aceeași schemă XML. Dar fișierele XML ale acestor înregistrări nu conțin aceeași succesiune de caractere, ceea ce va avea ca rezultat rezultate diferite, de exemplu, dacă obțineți o valoare hash.
Biblioteca SIRCrypt
Pentru a implementa semnarea XML în DIRECTUM, a fost scrisă o bibliotecă COM, în care sunt descrise trei clase: Hasher. Signer și XMLCanonicalizer pentru obținerea unui hash, valoarea EP și canonicalizarea documentelor XML, respectiv.
Pentru funcționarea bibliotecii este necesară Crypto PRO CSP (testat pe versiunile Crypto PRO CSP 3.6.6497 KC2) și .NET (minim 2.0).
Biblioteca este înregistrată executând următoarea comandă:
> regasm.exe "cale către dll" / codebase / tlb
Obiect Hasher pentru calculul hash-ului de către GOST
Conține câmpurile de conținut (tip "șir") și HashValueAsBase64 (tastați "șir") și o metodă de calculare a valorii hash a funcției Hash (). Pentru a calcula, trebuie să însemnați Conținutul. apelați metoda Hash (). în urma căruia valoarea hash în Base64 va fi scrisă în câmpul HashValueAsBase64.
Obiect Signer pentru obținerea valorii EP conform GOST
Conține câmpurile de conținut (tipul "șir"), ContainerName (tip "șir"), CertificateAsPEM (tip "șir"), BESignatureValueAsBase64 (tip "șir"); După ce obiectul este inițializat, trebuie să specificați Conținutul (datele care urmează să fie semnate), ContainerName (numele containerului cheii private a certificatului), să apelați metoda Sign (). După aceasta, câmpul CertificateAsPEM va primi certificatul corespunzător cheii private din Base64, iar în câmpul BESignatureValueAsBase64 valoarea semnătură sub forma unui șir Base64.
Obiectul XMLCanonicalizer pentru canonizarea XML
Conține câmpuri XMLContent (tip "șir"), CanonicalXML (tip "șir"), metoda C14NExc (). Pentru a obține forma canonică a XML, trebuie să însemnați XMLContent. apel C14NExc (). obțineți rezultatul din câmpul CanonicalXML.
Structura de semnături XML
Crearea semnăturii este după cum urmează: în primul rând se formează baza pachetului de săpun, nodurile Header și Body. Corpul este umplut cu date și se adaugă atributul wsu: ID = "Corp" - identificatorul datelor care urmează să fie semnat.
Apoi, trebuie să pregătiți o structură de securitate și să o activați în Header.
Structura de securitate este populată în următoarea ordine:
- Luăm valoarea funcției hash din nodul Body în formă canonică și o punem în nodul DigestValue.
- Nodul SignedInfo este convertit în forma canonică, semnat de EP. Rezultatul în formatul Base64-string intră în nodul SignatureValue.
- Cheia publică pentru certificatul care a fost semnat este plasată în nodul BinarySecurityToken în formatul Base64.
Pentru a verifica EP astfel format, este necesar să faceți toți pașii în ordine inversă, și anume:
- obține forma canonică a elementului SignedInfo.
- Folosind rezultatul pasului anterior, verificați dacă valoarea EE din nodul SignatureValue este validă cu cheia publică a certificatului. În acest stadiu, este verificată numai corectitudinea PE, ceea ce nu garantează invariabilitatea datelor.
- Dacă validarea EP are succes, se compară hașul de la nodul DigestValue și hash-ul de la nodul de date. Dacă acestea sunt inegale, atunci datele semnate sunt modificate și întregul EP este nevalid.
Exemplu de utilizare
Pachetul de dezvoltare și bibliotecă
Exemple de semnare XML către ISBL (script): dev.zip (5,95 Kb)
Pentru utilizarea permanentă, codul care efectuează semnarea tipică a plicului SOAP finit este inclus în funcția SignSOAP ().
Pentru semnare, un certificat este utilizat din magazinul personal de certificate al utilizatorului curent.