Accreditamento SDICoop: configurazione SSL su Apache

qualcuno di voi è riuscito a ricevere le notifiche/fatture da sdi?
riesco a riceverle tramite mail ma non tramite il canale, viene sempre rifiutato per il tipo di crittografia o certificato.

come avete configurato i certificati sul server per riuscire a ricevere le informazioni e quali protocolli avete abilitato (o che tipo di versione di distribuzione state usando. ho letto ci sono diversi bug per le vecchie)

Ciao a tutti, sto tentando di eseguire la procedura di accreditamento all’SDICoop.

Mi sono bloccato nella pagina in cui vengono richieste le CSR; i miei dubbi sono:

  • Devo semplicemente inviare il file csr che genero con il comando openssl? Perché nella pagina c’è scritto che “Il Sistema di Interscambio accetta CSR in formato .der, .pem e .arm”, quindi immagino che devo eseguire dei passi ulteriori.
  • Nella pagina di accreditamento inoltre viene richiesto un certificato CSR client ed uno server, cosa si intende esattamente? Significa che devo generare due CSR distinti?

Scusate le domande un po’ banali, ma non sono molto ferrato in ambito sistemistico ed avrei bisogno di qualche chiarimento.

Vi ringrazio in anticipo per ogni informazione utile a riguardo.

Mi rispondo da solo nel caso dovesse servire a qualcuno.
Per far funzionare l’invio del file di test verso il SdI ho utilizzato questo codice:

$pemPath="./cartella-certificati/SDI-xxxxxxxxxxxxxxxxxx-clientpfx.pem";
$wsdl=‘https://testservizi.fatturapa.it/SdI2AccoglienzaWeb/SdIRiceviFile_service/WEB-INF/wsdl/SdIRiceviFile_v1.0.wsdl’;
$url = ‘https://testservizi.fatturapa.it/ricevi_file’;

//Il certificato dell’ambiente di test appare scaduto al client Soap
$opts = array(
‘ssl’ => array(
// set some SSL/TLS specific options
‘verify_peer’ => false,
‘verify_peer_name’ => false,
‘allow_self_signed’ => true
),
‘http’=> array(
‘user_agent’ => ‘PHPSoapClient’
)
);

$options = array(
‘stream_context’ => stream_context_create($opts),
‘location’ => $url,
‘local_cert’ => $pemPath,
‘passphrase’ => ‘xxxxxxx’, //Password con cui si è creato il certificato
‘soap_version’ => SOAP_1_1,
‘verifypeer’ => false,
‘verifyhost’ => false,
‘cache_wsdl’ => WSDL_CACHE_NONE,
‘trace’ => true,
‘exceptions’ => true,
‘connection_timeout’ => 180,

);
$client = new MTOMSoapClient($wsdl ,$options );

2 Mi Piace

Ciao, c’è un modo di poterti contattare in merito alle classi php? Grazie

Ciao Stefano. Abbiamo un server LAMP condiviso con la tua stessa configurazione. Il server ospita più virtual host, ma abbiamo reso primario il certificato SDI.
Abbiamo eseguito l’invio del primo test (fattura errata) con esito positivo ma non riceviamo la notifica di scarto; l’errore segnalato nel pannello del test è org.apache.axis2.AxisFault: HTTP ( 301 ) Moved Permanently address.
Nei log degli accessi vediamo i tentativi di sdi che ricevono errore 301 (un reindirizzamento ad altro url). Nello schema wsdl che esponiamo (TrasmissioneFatture inviato dalla Agenzia delle Entrate alla stipula dell’accordo) abbiamo indicato come endpoint il nostro url che espone il webservice relativo.
Può dipendere dal fatto che SDI non supporta SNI?

Ciao Enzo,
la risposta 301 potrebbe dipendere dal fatto che SDI non supporta SNI, ma forse dovresti aumentare il log di Apache HTTPD per vedere come viene trattata la richiesta.
Nella configurazione che ho pubblicato non ci sono risposte di questo tipo quindi dovresti cercare di vedere quale altra configurazione del tuo server va a gestire la richiesta.
Per aumentare il dettaglio del log puoi usare la direttiva LogLevel ad un livello superiore rispetto a VirtualHost.

per caso avete avuto anche voi problemi con le notifiche di scarto e accettazione?
stiamo provando a rifiutare una fattura ricevuta ma per qualche ragione l’esito è sempre ES00

l’XML inoltrato è

< ?xml version=“1.0” encoding=“UTF-8”?>
< types:NotificaEsitoCommittente xmlns:types=“http://www.fatturapa.gov.it/sdi/messaggi/v1.0” xmlns:ds=“http://www.w3.org/2000/09/xmldsig#” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” versione=“1.0” xsi:schemaLocation="http://www.fatturapa.gov.it/sdi/messaggi/v1.0 MessaggiTypes_v1.0.xsd ">
< IdentificativoSdI>xxxxxxx< /IdentificativoSdI>
< RiferimentoFattura>
< NumeroFattura>xxxx< /NumeroFattura>
< AnnoFattura>xxxx< /AnnoFattura>
< /RiferimentoFattura>
< Esito>EC02< /Esito>
< /types:NotificaEsitoCommittente>

l’array inoltrato è di tipo
[IdentificativoSdI] => xxxxxxx
[NomeFile] => ITxxxxxxxxxxx_xxxxx_EC_001.xml
[File] => xxx

e l’end point usato è : https://testservizi.fatturapa.it/ricevi_notifica
il wsdl è : https://testservizi.fatturapa.it/SdI2RicezioneNotificheWeb/SdIRiceviNotifica_service/WEB-INF/wsdl/SdIRiceviNotifica_v1.0.wsdl

c’è qualche errore che non vedo?

grazie.

Non ne vengo fuori. Una domanda : nello schema “TrasmissioneFatture_v1.1.wsdl” fornito all’accreditamento hai cambiato namespaces e location con i riferimenti del tuo server? Se si ne hai una porzione da postare? grazie

Salve a tutti, volevo sapere per qualcuno ha trovato soluzione all’errore “org.apache.axis2.AxisFault: HTTP ( 500 ) Internal Server Error address : https://26.2.162.231:80” in ricezione delle chiamate da parte dell’SdI.

@enzo : usi Apache24 ?

quell’errore capita quando il certificato installato o che viene mostrato non è corretto.
il tuo endpoint deve mostrare il certificato selfsigned di sogei e deve richiedertelo quando accedi alla pagina tramite browser.

Ciao Daniele, io uso Apache24.

I certificati mi pare siano correttamente installati.
Io ho messo

SSLCerficateFile /etc/apache2/ssl.crt/SDI-Server.pem
SSLCertificateKeyFile /etc/apache2/ssl.crt/mykey.key
SSLCertificateChainFile /etc/apache2/ssl.crt/caentrate.der
SSLCACertificateFile /etc/apache2/ssl.crt/CA_All.pem # File somma caentrate.der+CAEntretetest.cer )

SSLVerifyClient optional
SSLVerifyDepth 5
SSLStrictSNIVHostCheck off

Puoi darmi una mano ?

purtroppo non mi occupo della parte sistemistica ma solo lato programmazione quindi non saprei da dove partire per aiutarti.

da quello che vedo però la tua configurazione sembra corretta. il secondo post di questa pagina riporta praticamente la configurazione che ho utilizzato.

posso dirti che quell’errore mi è capitato anche quando era stato inserito un controllo sul certificato a prescindere che fosse sulla configurazione virtual host o su php.

Dalle varie prove che ho fatto non mi sembra essere un problema sul certificato, in quanto Apache risponde e valida correttamente il certificato del client che chiama, ed infatti logga perfettamente la chiamata del server SdI. Leggendo vari altri post parrebbe che lato server l’applicazione non riesca a mappare correttamente l’envelope SOAP che my viene inviato, come se l’applicazione non trovi i giusti percorsi.

Qualcuno ha un esempio di codice, in qualsiasi linguaggio di programmazione, che sia funzionante con le chiamate soap in ingresso ? ( intendo relative all’implementezione del wsdl TrasmissioneFatture )

posso dirti che quell’errore lo da anche quando la pagina non è raggiungibile.

a livello di codice basta semplicemente una cosa come quest

$Service = new RicezionaFatture();
$opts = Array();
$opts['cache_wsdl']  = WSDL_CACHE_NONE;
try{
    $server = new SoapServer("RicezioneFatture_v1.0.wsdl", $opts); 
    $server->setObject($Service);
    $server->handle(); 
} catch (Exception $ex) {
    //debug
}

Il WSDL è quello originale fornito da fatturapa come il file xsd.
l’unica variazione fatta è stata quella sulla schemalocation e sul soapbind:address location in modo che punti rispettivamente alla posizione del file xsd e all’endpoint

Mi rispondo da solo. Avevamo impostato il SoapServer per ricevere attachments MTOM, invece le notifiche contengono gli allegati in base64… A posto

Sono anch’io al punto che invio ma ho problemi ad intercettare le response…
seguendo il tuo codice e utilizzando una classe semplice di prova tipo questa:
class RicezionaFatture{
function RicevutaConsegna()
{
$ricevuta1= array(array(“IdentificativoSdI”),array(“NomeFile”),array(“File”));
mail(‘me@miosito.com’, ‘Da SDICOOP Ricevuta Consegna’, $ricevuta1, $headers);
return $ricevuta1;
}
function NotificaMancataConsegna()
{
$ricevuta2= array(array(“IdentificativoSdI”),array(“NomeFile”),array(“File”));
mail(‘me@miosito.com’, ‘Da SDICOOP Notifica Mancata Consegna’, $ricevuta2, $headers);
return $ricevuta2;
}
function NotificaScarto()
{
$ricevuta3= array(array(“IdentificativoSdI”),array(“NomeFile”),array(“File”));
mail(‘me@miosito.com’, ‘Da SDICOOP Notifica Scarto’, $ricevuta3, $headers);
return $ricevuta3;
}
function NotificaEsito()
{
$ricevuta4= array(array(“IdentificativoSdI”),array(“NomeFile”),array(“File”));
mail(‘me@miosito.com’, ‘Da SDICOOP Notifica Esito’, $ricevuta4, $headers);
return $ricevuta4;
}
function NotificaDecorrenzaTermini()
{
$ricevuta5= array(array(“IdentificativoSdI”),array(“NomeFile”),array(“File”));
mail(‘me@miosito.com’, ‘Da SDICOOP Notifica Decorrenza Termini’, $ricevuta5, $headers);
return $ricevuta5;
}
function AttestazioneTrasmissioneFattura()
{
$ricevuta6= array(array(“IdentificativoSdI”),array(“NomeFile”),array(“File”));
mail(‘me@miosito.com’, ‘Da SDICOOP Attestazione Trasmissione Fattura’, $ricevuta6, $headers);
return $ricevuta6;
}
}

non ricevo le mail dalle funzioni mentre in fondo alla pagina endpoint una funzione di email generica invia correttamente dimostrandomi che SDICoop mi invia la response (cosa che vedo sia online che dal debug log del mio invio). Hai qualche dritta?
Grazie
Walter

non sono un esperto ma da quello che vedo mi sembra che hai dimenticato diverse cose.

penso dovrebbe essere qualcosa tipo

class RicezionaFatture{
function RicevutaConsegna($obj)
{

$array= get_object_vars($ob);

$ricevuta1= $array[“IdentificativoSdI”].$array[“NomeFile”].$array[“File”];
mail(‘me@miosito.com’, ‘Da SDICOOP Ricevuta Consegna’, $ricevuta1, $headers);
return $array;
}

Cosi funziona infatti. Ricevuta la mail con l’xml dalla notifica scarto (che è quella giusta). Grazie!

Scusate, io non sono un esperto di PhP ma mi ci sto cimentando visto che pare che usare altre soluzioni di integrazione con Sogei sia alquanto artificioso.

Mi viene un dubbio … scusate la mia ignoranza.
Se io creo però un file, diciamo TrasmissioneFatture.php, come devo indicare poi indicare l’endpoint ? Vorrei non doverli nuovamente cambiare presso l’agenzia perchè immagino sappiate bene quanto ti facciano penare …

Ciao Andrea,
per riuscire ad accreditare il canale hai necessità di avere conoscenze in web service, xml, un linguaggio di programmazione (c#, php, js, java, a seconda di quello che vuoi usare ) e url rewrite.
se non hai una conoscenza base in merito penso sarà difficile per te uscirne fuori.

per rispondere alla tua domanda. Prima decidi l’endpoint ( dominio di primo, secondo livello, cartella ) poi dove punta realmente lo sistemi con l’url rewrite.
ad esempio https://trasmissionefatture.nomedominio.eu potrebbe puntare a /var/www/nomecartellatest/trasmettifatturetest.php
e quando andrai in produzione , farla puntare a
/var/www/nomecartella/trasmettifatture.php

oltre a questo considera che per la fase di ricezioni devi avere conoscenza sulla gestione dei certificati, openssl e configurazione del server per i indicare quali certificati usare e come impostarli.