.NET non supporta nomi di elementi firma XMLDSIG non standard
-
28-10-2019 - |
Domanda
Sto cercando di implementare una specifica del settore che richiede firme digitali XML avvolte (XMLDSIG). Invece di conformarsi agli esempi (<Signature>
) la mia specifica usa il proprio nome per l'elemento firma:
<xs:element name="ensembleSignature" type="dsig:SignatureType" />
<!-- wish this was: <xs:element ref="dsig:Signature" /> -->
Quindi l'elemento non è chiamato "firma" ed è nello spazio dei nomi XML del dominio invece dello spazio dei nomi DSIG XML.
Con molto lavoro extra posso creare questa firma personalizzata in .NET.
- Usando la classe .NET SIGNEDXML CREAu003Cdsig:Signature> elemento
- Manipolo il DOM per rimuovereu003Cdsig:Signature> e ricreare l'elemento comeu003Cmyns:ensembleSignature> .
Ma sembra che .net non possa verificare la entratau003Cmyns:ensembleSignature> , anche se rinomino l'elemento in arrivo au003Cdsig:Signature> .
Sono stato sopra le specifiche XMLDSIG e sebbene tutti i loro esempi utilizzinou003CSignature> Non sembra richiedere specificamente questo nome elemento, anche per le trasformazioni avvolte. Quindi questo è un bug in Signedxml che supporta solo questo nome a singolo elemento quando non vi è tale requisito nelle specifiche XMLDSIG?
Soluzione
L'uso di un nome di elemento non standard non è possibile in .NET. Ma il nome dell'elemento firma non fa parte del digest, quindi è possibile rimuovere l'elemento firma "personalizzato" e aggiungere un nome dell'elemento di firma "standard" (u003CSignature> ) ma fai attenzione a non cambiare spazio bianco o spazi dei nomi nell'elemento firma È parte del digest. Nel metodo di canonicalizzazione sto usando lo spazio bianco è significativo, così come lo spazio dei nomi degli elementi.
- Carica XML in XMLDocument
- trovau003CcustomSignature xmlns="http://b-to-b.com/Namespace">
- Crea nuovo elementou003CSignature>
- spostare tutti i bambini diu003CcustomSignature> a
- Fare attenzione a non disturbare lo spazio bianco o lo spazio dei nomi diu003CSignedInfo> .
- sostituireu003CcustomSignature> insieme au003CSignature>
- Verifica la firma utilizzando la classe .NET firmata