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
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.
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…