PHP Soap ssl come fidarsi del certificato autofirmato

Sto facendo un client in php con soap per un webservice in .net. Il servizio web esegue https con un certificato autofirmato e per i test devo fidarmi di questo certificato senza installarlo.

Il problema è che ho sempre ricevuto questo errore:

SOAP-ERROR: analisi WSDL: imansible caricare da " https://winsystemsintl.com:54904/PSAService.svc?wsdl ": imansible caricare l'entity framework; esterna " https://winsystemsintl.com:54904/PSAService.svc? wsdl ".

Ecco il mio codice:

$opts = [ 'ssl' => [ // set some SSL/TLS specific options 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true ], 'http'=>[ 'user_agent' => 'PHPSoapClient' ] ]; // Initialize Soap Client $this->client = new SoapClient($this->wsdl, arrays('ssl_method' => SOAP_SSL_METHOD_SSLv3,'soap_version' => SOAP_1_2, 'location' => 'https://winsystemsintl.com:54904/PSAService.svc','stream_context' => stream_context_create($opts), 'exceptions' => true, 'trace' => true)); 

Sono stato in grado di get wsdl con wget:

wget –secure-protocol = SSLv3 https://winsystemsintl.com:54904/PSAService.svc?wsdl –no-check-certificate

Spero che qualcuno mi possa aiutare, grazie mille.

Il problema è che PHP ignora il tuo context di streaming durante il download del file WSDL . Una soluzione alternativa è scaricare il file WSDL e tutte le importzioni dello schema nel file system locale (sto usando in tidy qui per printingre l'XML):

 wget --secure-protocol=SSLv3 https://winsystemsintl.com:54904/PSAService.svc?wsdl --no-check-certificate -O - | tidy -xml -indent > PSAService.svc?wsdl wget --secure-protocol=SSLv3 https://winsystemsintl.com:54904/PSAService.svc?xsd=xsd0 --no-check-certificate -O - | tidy -xml -indent > PSAService.svc?xsd=xsd0 wget --secure-protocol=SSLv3 https://winsystemsintl.com:54904/PSAService.svc?xsd=xsd1 --no-check-certificate -O - | tidy -xml -indent > PSAService.svc?xsd=xsd1 wget --secure-protocol=SSLv3 https://winsystemsintl.com:54904/PSAService.svc?xsd=xsd2 --no-check-certificate -O - | tidy -xml -indent > PSAService.svc?xsd=xsd2 wget --secure-protocol=SSLv3 https://winsystemsintl.com:54904/PSAService.svc?xsd=xsd3 --no-check-certificate -O - | tidy -xml -indent > PSAService.svc?xsd=xsd3 

Successivamente, devi modificare PSAService.svc?wsdl (il nome file che wget ha salvato in) e modificare le importzioni in modo che puntino al tuo sistema locale anziché al web. Usa la function di sostituzione di tutti nel tuo editor preferito e sostituisci 'https://winsystemsintl.com:54904/' con '' :

Esempio prima:

 <wsdl:types> <xsd:schema targetNamespace="http://tempuri.org/Imports"> <xsd:import schemaLocation="https://winsystemsintl.com:54904/PSAService.svc?xsd=xsd0" namespace="http://tempuri.org/" /> <xsd:import schemaLocation="https://winsystemsintl.com:54904/PSAService.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/" /> <xsd:import schemaLocation="https://winsystemsintl.com:54904/PSAService.svc?xsd=xsd2" namespace="http://schemas.datacontract.org/2004/07/PSA.Service.MessageObjects.Pregunta" /> <xsd:import schemaLocation="https://winsystemsintl.com:54904/PSAService.svc?xsd=xsd3" namespace="http://schemas.datacontract.org/2004/07/PSA.Service.MessageObjects.Respuesta" /> </xsd:schema> </wsdl:types> 

Dopo:

 <wsdl:types> <xsd:schema targetNamespace="http://tempuri.org/Imports"> <xsd:import schemaLocation="PSAService.svc?xsd=xsd0" namespace="http://tempuri.org/" /> <xsd:import schemaLocation="PSAService.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/" /> <xsd:import schemaLocation="PSAService.svc?xsd=xsd2" namespace="http://schemas.datacontract.org/2004/07/PSA.Service.MessageObjects.Pregunta" /> <xsd:import schemaLocation="PSAService.svc?xsd=xsd3" namespace="http://schemas.datacontract.org/2004/07/PSA.Service.MessageObjects.Respuesta" /> </xsd:schema> </wsdl:types> 

Ripeti per ciascuno dei file che sono stati scaricati.

Quindi, modifica il tuo codice come segue (presumo che tutti i file PHP / WSDL si trovino nella stessa cartella):

 $opts = [ 'ssl' => [ // set some SSL/TLS specific options 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true ], 'http'=>[ 'user_agent' => 'PHPSoapClient' ] ]; // Initialize Soap Client $client = new SoapClient('PSAService.svc?wsdl', arrays('ssl_method' => SOAP_SSL_METHOD_SSLv3,'soap_version' => SOAP_1_2, 'location' => 'https://winsystemsintl.com:54904/PSAService.svc','stream_context' => stream_context_create($opts), 'exceptions' => true, 'trace' => true)); var_dump($client->__getFunctions()); 

Ora SoapClient ha saltato il download del WSDL dal Web e sei pronto per iniziare a effettuare chiamate utilizzando il context dello stream.