Salve a tutti, anche noi abbiamo lo stesso problema.
Condivido la nostra problematica nella speranza di trovare una via comune risolutiva.
Il nostro Web Service è caricato in un server Linux ed implementato tramite PHP.
PARTE 1
Fino ad ora abbiamo provato ad eseguire l’invio delle fatture tramite la classe SoapClient di php, con il seguente codice:
$ssl_params=array(
//‘ciphers’=>“ECDHE-RSA-AES128-SHA256”, //non influente
//‘crypto_method’=>non necessario
‘verify_peer’=>true,
‘local_cert’ =>“SDI-XXXXXXXXXXX.pem”,
//‘local_pk’ =>“SDI-XXXXXXXXXXX.key”,
‘cafile’=>“caentrate_full.der”,
);
$client_params=array(
“location”=>$endpoint,
“cache_wsdl”=>WSDL_CACHE_NONE,
“trace”=>TRUE,
“stream_context”=>stream_context_create([‘ssl’ => $ssl_params]);
);
$client=new SoapClient($wsdl,$client_params);
Abbiamo eseguito un’infinità di combinazione dei certificati ottenendo sempre lo stesso risultato:
{“faultstring”:“Forbidden”,“faultcode”:“HTTP”}
Faccio presente che in ambiente PHP i file tipo P12 o PFX non sono supportati quindi bisogna convertirli in PEM. Ma anche eseguendo questa conversione otteniamo lo stesso risultato: “FORBIDDEN”.
E’ assai strano che in un precedente Test di Accreditamento, con il codice appena esposto, siamo riusciti a inviare le fatture, ma avviando un nuovo test non funzionava più.
PARTE 2
A questo punto abbiamo supposto che la classe SoapClient di php non sia in grado di supportare efficacemente il protocollo SSL, quindi abbiamo creato una classe derivata “SDISoapClient” (estendendo SoapClient) ed abbiamo fatto l’override della funzione _doRequest(). L’intento è quello di inviare le SOAP request tramite CURL che offre maggiori controlli.
function __doRequest($request, $location, $action, $version){
$certspath="./path_to_certs/";
//CA file
$cafile=“caentrate_full.pem”;
//PRIVATE KEY file
$keyFile = “SDI-XXXXXXXXXXX.key”;
//Client CERT file
$clientCertFile = “SDI-XXXXXXXXXXX.pem”;
$headers = array(
"Content-type: text/xml;charset=“utf-8"”,
“Accept: text/xml”,
“Cache-Control: no-cache”,
“Pragma: no-cache”,
“SOAPAction: {$action}”,
//"Content-length: ".strlen($request),
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
//curl_setopt($ch, CURLOPT_PORT, 443);
curl_setopt($ch, CURLOPT_SSLKEY, $certspath.$keyFile);
curl_setopt($ch, CURLOPT_SSLCERT, $certspath.$clientCertFile);
curl_setopt($ch, CURLOPT_CAINFO, $certspath.$cafile);
curl_setopt($ch, CURLOPT_URL, $location);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $request); // la SOAP request
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
//INVIO
$dati = curl_exec($ch);
$err_num=curl_errno ($ch);
$err_desc=curl_error($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
//DEBUG
echo “—CURL RESPONSE:\ndati={$dati}\nerr_num={$err_num}\nerr_desc={$err_desc}\nhttpcode={$httpcode}”;die;
}
Anche in questo caso abbiamo tentato una combinazione infinita di certificati e chiavi private (cifrate e non cifrate) ottenendo sempre lo stesso risultato:
Error 403: AuthenticationFailed
Abbiamo aperto un ticket per il SdI ormai da una settimana ma non abbiamo ricevuto alcuna risposta.
Spero che qualcuno riesca a trovare una soluzione.
Attendo con speranza un vostro contributo.