P7m codificato

quella funzione converte il file in smime…
e ti ritorna 1 se ci riesce…

Ah ok non capivo perchè mi sovrascriveva l’originale.
Ad ogni modo non mi restituisce 1 ma credo la dimensione (nel mio caso mi da INT 9648)
Ad ogni modo ho modificato lo script per creare un secondo file su cui operare…ma ricevo errore:

Warning: openssl_pkcs7_verify(): error opening the file, CA.pem

Eppure il file CA.pem (che ho recuperato con il link allo script che mi hai indicato è presente. Il file CA.pem l’ho recuperato tramite virtualizzazione di ubuntu per fare prima e messo nella cartella dove faccio il test)

Funzione:

function der2smime($file)
{
$to=<<<TXT
MIME-Version: 1.0
Content-Disposition: attachment; filename=“smime.p7m”
Content-Type: application/x-pkcs7-mime; smime-type=signed-data; name=“smime.p7m”
Content-Transfer-Encoding: base64
\n
TXT;
$from=file_get_contents($file);

$to.=chunk_split(base64_encode($from));

return file_put_contents("smime.p7m-b6m",$to);

}

$file = “IT03461720173_00B60.xml.p7m”;

$response = der2smime($file);

var_dump($response);

$output = openssl_pkcs7_verify (“smime.p7m-b6m” , 0 , null ,array(“CA.pem”),“CA.pem”,“IT01234567890_00001.xml”);

var_dump($output); // <— sempre -1 con errore di cui sopra indicato

hai cambiato la url da cui prelevare i certificati CA come ti avevo scritto ?

si si ho messo la url che mi hai dato tu. per lo script sh che mi hai linkato ho visto che nel github erano presenti 2 versioni di script. io ho provato il primo che mi ha funzionato. dovevo usare il secondo? Comunque per sicurezza allego il CA.pem recuperato magari non è giusto? link a wetransfer: https://we.tl/t-VaCVN1AIOm

no il CA è giusto…
hai provato a verificare se quel P7M passa la verifica ufficiale della firma sul sito di infocamere ?
https://www.firma.infocert.it/utenti/verifica.php

Ciao in effetti ho mandato il mio file alla verifica e mi dice: File di input con formato non conosciuto

Eppure si tratta di una fattura passiva che ho ricevuto sul portale di aruba quindi è valida e ha passato i test dell’ AdE…

mi piacerebbe vedere quel file…
in 30 giorni ho visto molta fantasia fra i nostri colleghi programmatori…

inviato in pvt grazie

CVD:
da wikipedia (versione inglese)
The [UTF-8] representation of the BOM is the byte sequence 0xEF,0xBB,0xBF .
The Unicode Standard permits the BOM in [UTF-8] but does not require or recommend its use.

Ma qualche simpaticone li usa ugualmente…

Mi viene in mente di usare in successione queste regex:
\x04[\x00-\xF7]
\x04\x80.
\x04\x81…
\x04\x82…
Ecc

Ovviamete la terza è \x04\x81…

So che .NET mette il BOM di default quando si salva un file XML, perché l’encoding di default è “utf-8 con BOM”. Bisogna specificare esplicitamente l’encoding “utf-8 senza BOM” per evitarlo.
Immagino che molti programmatori hanno usato il default senza porsi il problema.

si ma qui è il p7m ad essere “BOMMATO” in UFT-8

Grazie! ora il mio file passa la verifica qui:
https://www.firma.infocert.it/utenti/verifica.php

Ma mi rimane sempre l’errore:
Warning: openssl_pkcs7_verify(): error opening the file, CA.pem

sembra che il problema sia sul file CA.pem … ma se mi dici che è corretto non capisco il problema :frowning:

Per la cronaca uso PHP 5.5.12 in locale con WAMP su windows 10

Codice aggiornato ad ora:

function der2smime($file)
{
$to=<<<TXT
MIME-Version: 1.0
Content-Disposition: attachment; filename=“smime.p7m”
Content-Type: application/x-pkcs7-mime; smime-type=signed-data; name=“smime.p7m”
Content-Transfer-Encoding: base64
\n
TXT;
$from=file_get_contents($file);

$to.=chunk_split(base64_encode($from));

return file_put_contents("smime.p7m-b6m",$to);

}

$file = “IT03461720173_00B60.xml.p7m”; //file originale può contenere BOM

$filenobom = “NOBOMIT03461720173_00B60.xml.p7m”; //DESCRIZIONE NO-BOM (ora vuoto)

//remove bom

// -------- read the file-content ----
$str = file_get_contents($file);

// -------- remove the utf-8 BOM ----
$str = str_replace("\xEF\xBB\xBF",’’,$str);

//crea file senza bom

file_put_contents($filenobom, $str);

$response = der2smime($filenobom);

var_dump($response);

$output = openssl_pkcs7_verify (“smime.p7m-b6m” , 0 , null ,array(“CA.pem”),“CA.pem”,“IT01234567890_00001.xml”);

var_dump($output);

Ma sei proprio sicuro di questa cosa? Non è che il BOM viene inserito da qualche tua procedura dopo la ricezione del file da parte di SdI?
Lo chiedo perché ho provato ad aggiungere a mano il BOM ad un file p7m e la verifica online sul sito dell’AdE mi dice che non è valido. Il file p7m è un file binario e non un file di testo. Aggiungendo il BOM (o qualsiasi altra cosa) in testa, lo si rende non leggibile.

1 Mi Piace

Concordo con tutto quello che hai detto, ma questo è il file che mi è stato passato per debug da @itajackass non l’ho ricevuto direttamente io…

Ok. Io comunque aspetto di riceverne uno prima di toccare il mio codice.

Idem… i file che non mi vengono letti li sbatto in una cartella anomalie e me li segnalo…
per ora ne ho ricevuti 3 su 10000 ed ho corretto il codice (varie versioni di terminatori di linea su base64)

Chiedo venia: in effetti ho provato a scaricare il file direttamente da pannello aruba con accesso in manuale, sia che con chiamata web service e in effetti i 2 differiscono! E’ la mia funzione che inserisce il BOM implicitamente:

posto il mio script incriminato che correggerò.

ajax/get_xml_from_aruba.php:



$fattura = get_fattura_from_aruba($idFattura);
$fileNameXML = $fattura[‘filename’];
$fileBase64 = $fattura[‘file’];
$fileDecoded = base64_decode($fileBase64);

header(‘Content-Disposition: attachment; filename="’ . $fileNameXML . ‘"’);
header(‘Content-type: “text/xml”; charset=“utf8”’); //<---- mi mette BOM qui??
header(‘Connection: close’);

echo $fileDecoded;

secondo me è li che il php inserice i BOM…
quando li scrivi sui file apri il file in binary mode… su windows cambia parecchio le cose…

1 Mi Piace