Estrarre XML da un file con firma digitale

Salve,
mi chiedevo se è possibile estrarre il contenuto XML di una fattura elettronica con apposta la firma digitale, se sì come è possibile procedere ??

GRAZIE come sempre del vs. prezioso aiuto

Lo chiedi da sviluppatore o da normale utente?

Se è la seconda, puoi usare uno dei tanti programmi per la firma digitale (tipo Dike di InfoCert o ArubaSign di Aruba) oppure anche online sui siti di PosteCert e InfoCert. Cerca “Come aprire file p7m” con google.

come programmatore informatico

openssl smime -verify -noverify -in file.xml.p7m -inform DER -out file.xml

aggiungo che se ci dici anche il linguaggio di programmazione usato, qualcuno che magari c’e’ passato potrebbe dirti di più.

A mio parere il metodo migliore è utilizzare OpenSSL.

Come ha detto @genesi, dipende dal linguaggio di programmazione.
Se usi .NET, il framework ha già le funzioni necessarie. Vedi qui: Estrazione xml da file p7m
Immagino che anche in Java si trova tutto già pronto (ma non usandolo non so dirti come si fa).
Se invece usi php, ti conviene seguire i consigli di @fednikx e @giacomello1 e usare OpenSSL.

Tieni anche presente che alle volte i file .p7m sono codificati in base64, quindi dovrai prima verificare se sono dati base64 e, se lo sono, eseguire la decodifica base64 prima di estrarre il file xml.

Ci sono già parecchi topic a riguardo in questo forum.

Il Linguaggio che usiamo è ormai vecchio, comunque si tratta del VB6

Con VB6 non credo ci sia niente di integrato.
Qualche idea:

  • Usare OpenSSL. Non so se c’è già qualcosa di pronto per usare direttamente la libreria (dll) di openssl. Se no, potete sempre eseguire openssl come programma esterno.
  • Usare la libreria Chilkat, che però è a pagamento.

Da dove posso scaricare OpenSSL per Windows se è possibile ??

https://wiki.openssl.org/index.php/Binaries
qui ci sono tutte le versioni

GRAZIE mille come sempre del vs. prezioso aiuto

1 Mi Piace

Più o meno una cosa del genere può bastare:

$regex="/(?=\<\?xml|\<.*Fattura.*\>)([\s\S]*)(?=\<\/.*FatturaElettronica)/";

p.s. non sono un mago delle espressioni regolari

no non basta o perlomeno non basta sempre…
La regexp potrebbe estrarre un xml non valido.
Il P7M può contenere chunks di lunghezza differente con headers presenti ad ogni chuck.
Le regexp funzionano solo su P7M senza chunk ma quando le fatture contengono allegati di dimensioni significative non è garantito che la regexp ti estragga la fattura senza contenuti spuri aggiunti.
se ne è già parlato qui…

1 Mi Piace

Io ho risolto al momento con una cosa di questo tipo:

 $content=preg_replace('/([\x0-\x8]{1}[^A-Za-z0-9]{1})|([\x0-\x8]{1}[[:ascii:]]{1})|([^\x{000}-\x{007A}])/','',$xml);

Come dicevo non sono un esperto di espressioni regolari, però al funziona.

1 Mi Piace

Se usi C# o VB.Net puoi usare il namespace System.Security.Cryptography.Pkcs
Ecco un esempio in VB.Net (previo Imports System.Security.Cryptography.Pkcs):

Dim sSignedBytes() As Byte = My.Computer.FileSystem.ReadAllBytes(sFile)
Dim sContentBytes() As Byte
Dim SignedCms As New SignedCms()
SignedCms.Decode(sSignedBytes)
sContentBytes = SignedCms.ContentInfo.Content
sXML = System.Text.Encoding.Default.GetString(sContentBytes)

Nella variabile sXML ti trovi il solo xml senza la firma.

2 Mi Piace

Io uso firmacerta di Namirial

Per curiosità, hai continuato a utilizzare questo metodo o hai riscontrato problemi?

salve,
e nel caso in cui il file sia codificato in base64 cosi si procede?
grazie