A dire il vero lo script anche su server aruba mi restituisce lo stesso valore con il BOM. E il server aruba è sotto linux. Provo a cercare maggiori informazioni per modificare questo problema e poter procedere successivamente al prossimo step, cioè all’errore del CA.pem
domanda: ma non ti conviene visto che il server di destinazione finale è linux sviluppare in locale sotto linux e lasciar perdere wamp ?
comunque io nell’header metterei application/binary…
application/binary funziona sia con un xhtml che con un binario, text/xml con un binario non è detto che vada…
Ho provato a fare un test veloce sulla mia macchina Linux (CentOS 7) con configurazione apache e php di default e non mi aggiunge nessun BOM con il codice da te riportato (mettendo una semplice stringa nella variabile fileDecoded).
Mi sa che ti conviene mettere dei controlli in vari punti delle tue procedure per capire dove esattamente viene aggiunto il BOM.
Sono riuscito a far partire lo script: openssl_pkcs7_verify (passandogli il file originale non corrotto preso dal pannello aruba per ora…quello che scarico io da script ancora è in fase di indagine sul perchè aggiunge BOM)
sotto windows in effetti mi da il problema sul CA.pem
uppandono sul server aruba e facendolo partire da li invece me lo esegue correttamente!
Ora devo indagare su quale sia il problema: perchè lo script non è detto che debba sempre girare su linux
per il CA.pem credo che il problema siano i terminatori di riga…
prova su linux a trasformare il CA.pem acquisito in formato DOS usando unix2dos o recode o altre utility simili.
farò qualche prova e vi tengo aggiornati. Grazie mille
Scusami, se stai sotto linux non puoi usare tramite exec il comando:
base64 --decode percorso/file.p7m > percorso/decode_file.p7m
e vedi cosa ti restituisce… io ho risolto semplicemente così, non uso php ma il principio non cambia.
Se può servire, ho convertito lo script in PHP da quello .sh per recuperare la lista certificati. Forse ci sarà un metodo più elegante ma io posto quello che sono riuscito a fare.
Ho usato PHP_EOL dove delimitatore finale delle righe che è indipendente dal sistema operativo. Domani lo provo in ufficio e vediamo se era quello il problema.
<?php
$xmlDoc = simplexml_load_file('https://eidas.agid.gov.it/TL/TSL-IT.xml');
$content = "";
foreach ($xmlDoc->SchemeInformation->PointersToOtherTSL->OtherTSLPointer->ServiceDigitalIdentities->ServiceDigitalIdentity as $key)
{
$content .= "-----BEGIN CERTIFICATE-----" . PHP_EOL;
$content .= wordwrap($key->DigitalId->X509Certificate, 64, PHP_EOL, true);
$content .= PHP_EOL;
$content .= "-----END CERTIFICATE-----" . PHP_EOL;
}
foreach ($xmlDoc->TrustServiceProviderList->TrustServiceProvider as $key)
{
foreach ($key->TSPServices->TSPService as $key2) {
$content .= "-----BEGIN CERTIFICATE-----" . PHP_EOL;
$content .= wordwrap($key2->ServiceInformation->ServiceDigitalIdentity->DigitalId->X509Certificate, 64, PHP_EOL, true);
$content .= PHP_EOL;
$content .= "-----END CERTIFICATE-----" . PHP_EOL;
}
}
file_put_contents("test.txt",$content);
Qualche aggiornamento della funzione openssl_pkcs7_verify sotto windows (o almeno con le mie impostazioni).
Per risolvere il problema ho dovuto dare una path assoluta del file CA.pem, dove ROOT è una costante che identifica la radice della mia app.
$output = openssl_pkcs7_verify (ROOT . “/certificates/smime.p7m-b6m” , 0 , null ,array(ROOT . ‘/certificates/CA.pem’), ROOT . ‘/certificates/CA.pem’, ROOT . ‘/certificates/cleaned.xml’);
Ora mi apre i file firmati ma ricevo comunque un WARNING:
Warning: openssl_pkcs7_verify(): signature OK, but cannot open for writing
(nonostante il file cleaned.xml effettivamente me lo crea…siccome è solo un warning si può ignorare con @output = …)
Buongiorno a tutti!
Premetto che non mi occupo di programmazione ma mi devo occupare nel mio piccolo delle problematiche relative alla FE .
Avrei bisogno di capire cosa significa errore di “Codice HASH documento non corrispondente”. So che il messaggio scritto così dipende dal developer del software, ma volevo capire se è “risolvibile”. I file che viene scaricato sul server è in ITxxxxx.xml.p7m.xml . Aprendolo con un text editor è in chiaro, quindi presumo che il portale che mi scarica dall’SDI la fattura, la decodifichi . Dove “perdo” l’integrità dell’HASH ? Un tecnico mi ha detto che se faccio l’anteprima sul portale ( invece di farla dopo che è importato sul software ) è come se lo avessi già letto…
Domanda da “profano” : c’è modo di “riparare” questo HASH?
Spero mi possiate dare qualche dritta…
Saluti
Andrea
io per estrarre il contenuto da un file p7m ho fatto un bat che chiama openssl da linea di comando e finora non ho mai avuto problemi:
p7m2file.bat
set filename=%~n1
openssl smime -verify -in %1 -inform der -noverify -signer "%~dp1%filename%.cert.pem" -out "%~dp1%filename%"
del "%~dp1%filename%.cert.pem"
in seguito con un altro bat genero il pdf dall’xml:
xml2pdf.bat
set filename=%~n1
xsltproc -o "%~dp1%filename%.html" fatturaordinaria_v1.2.xsl "%~dp1%filename%.xml"
wkhtmltopdf "%~dp1%filename%.html" "%~dp1%filename%.pdf"
del "%~dp1%filename%.html"
fortunatamente openssl, xsltproc, wkhtmltopdf sono tutti tool free da linea di comando che si trovano già compilati anche per Windows
Probabilmente chi ha fatto il software ti rende visibile il file XML contenuto nel p7m, ma il file su cui viene calcolato ‘hash’ da SDI è il p7m quindi sta confrontando gli hash di due file diversi…
inoltre non capisco perché debba nominare il file .xml.p7m.xml e non .xml dato che lo ha rimosso dalla busta p7m…
La fantasia dei programmatori (o la loro incompetenza) purtroppo non ha limite…
è capitato anche a me oggi per la prima volta.
sul server di ricezione ho php aggiornato e non ho problemi
ma purtroppo purtroppo quello di alcuni clienti non lo è, e non riuscendo a sopprimere il warning e non potendo aggiornare la versione di php, ho dovuto zittire l’avviso con libxml_use_internal_errors()
Buongiorno a tutti.
Ho seguito la procedura per la creazione del file CA.pem e non ho nessun problema ed utilizzare la funzione openssl_pkcs7_verify come da voi indicato.
Ho prerò un problema nel convertire i file p7m di Aruba. Mentre con altri gestori non ho problemi e mi crea il file XML.
Altri di voi hanno questa problematica?
Grazie.
Ciao Romolo, sono qui per chiederti di nuovo aiuto su una nuova casistica che mi è capitata cercando di estrarre un p7m. Il mio script funziona con tutti tranne che per questo fornitore…che è sempre lo stesso… dopo varie prove ho visto che la sua firma risulta NON VALIDA - SCADUTA…
Se lo passo con DIKE però, il software è in grado di estrarmelo lo stesso…mentre con lo script non è in grado.
C’è un modo di dire alla funzione openssl_pkcs7_verify di PHP di estrarmelo lo stesso anche se firma scaduta? Ti allego il mio script con il p7m incriminato in pvt. eventualmente per chi è interessato posso postare invece lo script e basta: https://we.tl/t-ICLtBV0Ac1
Risolto con l’opzione: PKCS7_NOVERIFY
Per caso era firmato con il certificato dell’AdE?
(io lo faccio… )
No era un terzo intermediario… Comunque ho risolto ignorando i certificati scaduti con PKCS7_NOVERIFY