Accreditamento SDICoop: configurazione SSL su Apache

Ciao Daniele, io ho scritto il mio webservice in Delphi, che è il linguaggio che prediligo.
Il problema che ogni chiamata da parte del server delle agenzie Sogei torna con un errore " org.apache.axis2.AxisFault: HTTP ( 500 ) Internal Server Error address : https://26.2.162.231:80 " e da qui non se ne esce. Se io testo il mio servizio con SoapUI ( per esempio ) o con altri client Soap presenti on-line tutto funziona perfettamente, compreso l’handshake dei certificati SSL.

Quello che non riesco a comprendere è dove falliscano le chiamate che arrivano dall’SdI ed il perchè falliscano ( l’assistenza da risposte vage e senza senso … purtroppo ).

Per questa ragione sto provando a scriver il servizio SOAP con Php ( di cui ho poca esperienza ma mi ci arrabbatto ).

Se potete aiutarmi Vi ringrazio per la pazienza …

Quell’errore come ti ha scritto Daniele lo da quando la tua pagina server endpoint non è raggiungibile o anche quando vi è un errore di codice (come succedeva a me). La parte server se decidi di farla in php è molto semplice, la puoi ricostruire dai messaggi delle ultime 24 ore. Per la parte client (sempre in php) io ho usato nusoap che è una libreria standalone che mi ha aiutato molto coi suoi log dettagliati. Con la libreria MTOMSoapClient o il SoapClient base del php probabilmente ci metti molto più tempo a venirne a capo

Ok, ci sto provando … sul client non ho problemi infatti quello che ho scritto in Delphi funziona perfettamente ed invia i documenti … una domanda, se posso, vedo che nell’esempio sopra scritto Daniele scrisse di aver modificato il file wsdl e che 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, qui sulla posizione del file xsd si deve mettere l’indirizzo dov’è pubblicato oppure si può mettere anche la path assoluta di dove si trova il file ?

Sulla soapbind:address location ho messo l’url mentre sullo schemaLocation dell’xsd ho messo la path. In tal modo funziona

Scusate ancora … ho scritto questa procedura …

<?php

_ class TrasmissioneFatture_
_ {_

_ private $con;_

_ public function contructor(){
_ $this->con = (is_null($this->con)) ? self::connect() : $this->con;

_ }_

_ static function connect() {_

_ $con = mysql_connect(‘10.1.1.226’, ‘root’, ‘p4llm4ll’);_
_ $db = mysql_select_db(‘db_fatb2b’, $con);_

_ return $con;_

_ }_

_ function RicevutaConsegna($obj) { _
_ $array = get_object_vars($obj);_
_ $ricevuta1 = $array[“IdentificativoSdI”].$array[“NomeFile”].$array[“File”];_

_ $file = ‘/opt/fattb2b/log/RicevutaConsegna.txt’;_
_ file_put_contents($file, $ricevuta1, FILE_APPEND | LOCK_EX);_
_ }_

_ … _

_ }_

$Service = new TrasmissioneFatture();
$opts = Array();
$opts['cache_wsdl']  = WSDL_CACHE_NONE;
try{
$server = new SoapServer("TrasmissioneFatture_v1.1.wsdl", $opts); 
    $server->setObject($Service);
$server->handle(); 
} catch (Exception $ex) {
    $server->fault('Sender', $ex->getMessage());
}

?>

Continuo però a ricevere l’errore HTTP ( 500 ).

Considerando che il mio endPoint registrato è https://xxx.xx.xx/soap/TrasmissioneFatture ,
Ho messo nella mia configurazione del VirtualHost il valore

ProxyPass /soap/TrasmissioneFatture https://xxx.xx.xx/soap/TrasmissioneFatture.php

Mi viene però un dubbio … ma la chiamata che arriva dal SdI contiene anche la parte “TrasmissioneFatture” ??

Nel senso, viene chiamato "https://xxx.xx.xx/soap/TrasmissioneFatture/TrasmissioneFatture ?

Ciao sembrerebbe tutto ok. Hai riavviato httpd dopo aver modificato il virtual?
L’endpoint chiamato è quello che hai registrato quindi https://xxx.xx.xx/soap/TrasmissioneFatture e a quello SDI si collega. Senza modificare il virtualhost potevi creare una cartella TrasmissioneFatture dentro soap e mettere lo script php dentro una pagina index.php

Ciao Walter, ho infatti fatto come da te suggerito … stupidamente inizialmente mi ero focalizzato sul modificare il percorso … quindi dentro la cartella /soap/TrasmissioneFatture ci ho messo il mio file index.hp … ora però l’SdI però mi fornisce l’errore org.apache.axis2.AxisFault: HTTP ( 301 ) Moved Permanently address : https://26.2.162.231:80 hai idea di quale possa essere il motivo ?

Grazie mille ancora.

-il file TrasmissioneFatture_v1.1.wsdl (modificato con schemaLocation=“TrasmissioneTypes_v1.1.xsd” e soapbind:address location=tuo url) è nella directory TrasmissioneFatture?
-i permessi di lettura di TrasmissioneFatture_v1.1.wsdl sono corretti?
-TrasmissioneTypes_v1.1.xsd è nella directory TrasmissioneFatture?
-i permessi di lettura di TrasmissioneTypes_v1.1.xsd sono corretti?

Si a tutte le domande …

hai provato ad aprire la pagina che punta al tuo endpoint per vedere se ti da errori? riesci a vedere il file wsdl?

hai provato a creare un webservice client per inoltrare le notifiche?

Si ho creato un web-service client e funziona perfettamente ( anche con SoapUI ).
Chiaramente io provo tutto in locale e funziona perfettamente.

Se provo ad aprire il file wsdl dall’esterno sembra non si veda il contenuto ( ho potuto provare solo dal telefono ).

Ho però come l’impressione che in qualche modo non vada bene avere il wsdl in https ?

Penso sia cmq un problema del browser del telefono in quanto di fatto Apache non risponde con alcun errore … Eseguendo il PhP funziona e non da errori …

devi provare dal un browser di un pc…

a me se provo andare sull’endpoint mi ritorna

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Client</faultcode>
<faultstring>Bad Request</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

mentre se provo a fare endopoint?wsdl => sottodominio.dominio.it/trasmetti?wsdl
mi ritorna lo schema wsdl.

se a te non ritorna lo schema wsdl significa che c’è qualche errore.

Boh … a me sull’endpoint non mi rende nulla … manco in locale …

Ma quel “trasmetti” è qualcosa che hai tu implementato nella tua classe ?

$Service = new TrasmissioneFatture();
$opts = Array();
$opts['cache_wsdl']  = WSDL_CACHE_NONE;
try{
$server = new SoapServer("TrasmissioneFatture_v1.1.wsdl", $opts); 
    $server->setObject($Service);
$server->handle(); 
} catch (Exception $ex) {
//debug
    $server->fault('Sender', $ex->getMessage());
}

Ma sulla “soapAction” hai modificato qualcosa oppure hai lasciato il valore di default dell’agenzia ?

Perchè io ci ho lasciato il valore standard che è “http://www.fatturapa.it/TrasmissioneFatture/RicevutaConsegna” ed ho l’impressione che vada modificato anche questo …

lo avevo già scritto sopra ma te lo riscrivo.

nel soapserver va il puntamento relativo al tuo wsdl (se si trova nella stessa cartella, basta scrivere appunto il nome del wsdl, in caso contrario devi imputare le sotto directory)

nel file wsdl devi dire dove si trova lo schema xsd.
puoi farlo indicando il link assoluto al file (quindi compreso di https ) nello “schemalocation”

inoltre devi indicare al wsdl a quale endpoint è collegato.
e lo puoi fare riportando il link alla voce <soapbind:address location=

a quel punto deve andare salvo che non hai inserito qualche blocco http/https o riportato male i link

La configurazione apache è corretta. Se però il tuo sistena ospita più virtual host, il client SDI (che non supporta SNI) non riesce a effettuare correttamente la richiesta se il certificato da te esposto non risulta essere primario. Per ottenere questa configurazione devi accedere al primo file di configurazione per la connessione ssl che Apache carica (vedi lo schema in htppd.conf o apache2.conf a seconda della versione linux…). Nel mio caso viene caricato default_ssl.conf (server ubuntu).
Qui dentro devi trascrivere (copia e incolla) lo stesso blocco che hai citato sopra nella posizione della direttiva SSLEngin on. In questo modo “imbrogli” SDI che comunque accedendo trova esposto il suo certificato e può instaurare il dialogo

se l’endpoint che hai indicato nell’accordo stipulato è TrasmissioneFatture (senza slash finale) devi mettere nella root del tuo sito un file htaccess (o scrivere le stesse direttive nel virtualhost, meglio) che eseguano un rewrite delle richieste ^TrasmissioneFatture a TrasmissioneFatture/index.php, assumendo che il tuo script sia contenuto appunto in index.php

Ciao Antonio, anch’io ho il server Ubuntu.
Di fatto ho due virtualhost, anche se l’altro sulla porta 80 non mi serve, e quindi adesso lo tolgo.
Il problema però non pare sia sul certificato, ed infatti mi pare vada liscio.
Lo tolgo lo stesso per sicurezza. Ora ho aggiunto le direttive

RewriteEngine On
RewriteRule “^/soap/TrasmissioneFatture” “/soap/TrasmissioneFatture/index.php” [R]

e sto riprovando … speriamo vada …

per eliminare ogni possibile mismatch ti consiglio di rinominare la tua cartella TrasmissioneFatture in Trasmissione; quindi in htaccess devi avere qualcosa del genere:
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^soap/TrasmissioneFatture soap/Trasmissione/index.php

leva il flag [R] perché identifica un redirect (che non deve esserci: deve essere solo un rewrite, trasparente per chi chiama, ovvero l’url non cambia chiamando lo scripts).
La verifica la puoi fare facendo stampare qualcosa a schermo dal tuo file index.
La stessa cosa devi fare per il tuo endpoint in ricezione: aggiungi a seguire un’altra direttiva Rewrite analoga

Che dirti Antonio … ti ringrazio immensamente perchè ora funziona perfettamente !!! :wink:

Grazie mille!