Client SOAP PHP con certificati su SSL

Sto provando a configurare un client Soap con il seguente codice:

<?php $wsdl = 'https://domain.com/?wsdl'; $endpoint = 'https://domain.com'; $certificate = dirname(__FILE__) . '/CertWithKey.pem'; $password = 'pwd'; $options = arrays( 'location' => $endpoint, 'keep_alive' => true, 'trace' => true, 'local_cert' => $certificate, 'passphrase' => $password, 'cache_wsdl' => WSDL_CACHE_NONE ); try { $soapClient = new SoapClient($wsdl, $options); } catch(Exception $e) { var_dump($e); } 

Mi è stato fornito un file-chiave .p12 con un file di certificazione .crt. Usando openssl ho convertito il file .p12 in un file .pem e poi unito con il file .crt. Il CertWithKey.pem mi sembra buono, due blocchi di certificati sono nel file.

Non import cosa cerco di fare, continuo a ricevere un'exception con il messaggio SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://domain.com/?wsdl' : failed to load external entity "https://domain.com/?wsdl" .

Dopo aver telefonato con la parte remota, riconoscono che è in arrivo una richiesta, ma stanno registrando questo errore: l' ssl handshake interrupted by system [hint: stop button pressed in browser?!] .

Dato che finora non ho trovato nessuna informazione utile sulla networking, ho pensato di chiederti ai ragazzi di approfondire la questione.

Qualche suggerimento su cosa si può provare? Sono in esecuzione PHP 5.3.8 e l'indirizzo IP del server è bianco elencato nel firewall presso la parte remota.

Ho risolto questo problema. Penso che, a causa del numero di domande riguardanti questo problema e il numero di soluzioni diverse, altri trarranno beneficio dalla soluzione. Ecco qui:

Ho usato il programma CLI openssl per convertire il file-chiave .p12 in un file-chiave .pem. Il trucco è il modo in cui avviene la conversione.

Per prima cosa l'ho convertito con questo command e ho avuto il problema come descritto nella domanda:

openssl pkcs12 -in key.p12 -out key.pem -nodes -clcerts

Mentre il command seguente ha fatto il trucco reale:

openssl pkcs12 -in key.p12 -out key.pem -clcerts

Per maggiori informazioni si prega di consultare la fonte che ho usato: https://community.qualys.com/docs/DOC-3273

Stessi suggerimenti:

  1. Uso SoapClient per connettersi con i servizi SSL e tutto funziona correttamente senza specificare l'URL "endpoint". Quindi ti consiglio di provare senza questa opzione;

  2. Il php SoapClient ha un'opzione denominata "ssl_method" in cui è ansible modificare alcune varianti di questo protocollo. Prova a cambiare / specifica questo parametro se sai quale protocollo viene utilizzato;

  3. Specificare "verifypeer => false" e "verifyhost => false" nella list params;