2014-11-21 29 views
5

sto cercando di impostare un client di sapone con il seguente codice:PHP client SOAP con i certificati SSL oltre

<?php 
$wsdl   = 'https://domain.com/?wsdl'; 
$endpoint  = 'https://domain.com'; 
$certificate = dirname(__FILE__) . '/CertWithKey.pem'; 
$password  = 'pwd'; 

$options = array(
    '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 è stata data una chiave di file-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 importa cosa cerco di fare, continuo a ricevere un'eccezione 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 il partecipante remoto, riconoscono che è in arrivo una richiesta, ma stanno registrando questo errore: ssl handshake interrupted by system [hint: stop button pressed in browser?!].

Dal momento che non ho trovato nessuna informazione utile sulla rete finora ho pensato di chiederti ragazzi per qualche informazione in merito.

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.

risposta

4

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:

Ho utilizzato 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 ho convertito con questo comando e ho avuto il problema come descritto nella domanda:

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

Mentre il comando di seguito ha fatto il trucco vero e proprio:

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

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

+0

Sto anche cercando di inviare la richiesta SOAP a un server. Sono di fronte a un problema simile in cui non sono in grado di comunicare al server tramite la mia applicazione php. ma funziona tramite GUI SOAP. Ho un file .p12 che ho provato ad usare convertendo in file .pem. Quando creo l'oggetto client SOAP, ottengo l'errore: SOAP-ERRORE: Parsing WSDL: Impossibile caricare da https: // WSDL:? Impossibile caricare https entità esterne: // WSDL Can per favore dimmi cosa sta andando storto qui? –

+0

Se si è seguita la mia risposta e la chiave e i file crt vengono uniti correttamente, l'host remoto potrebbe avere un firewall abilitato e sta bloccando il proprio indirizzo IP. Altrimenti non posso ancora dirlo, forse dovresti aprire una domanda allora. – Ben

+0

Ho avuto lo stesso problema. E ho seguito i passaggi esatti che @Ben ha fornito. Il p12 doveva essere convertito in .pem usando il link fornito.Ma stavo ancora ricevendo l'errore: arricciatura: (58) Impossibile caricare il client cert -8018 Stranamente, ho capito che la passphrase che stavo fornendo era 3 -digits '123', invece ho dovuto fornire una passphrase valida di 6 caratteri alfabetici. Quindi, credo, ci dovrebbe essere una passphrase di buona lunghezza (non conosco la lunghezza minima). Successivamente mancavano le opzioni 'local_cert', 'passphrase' che dovrebbero essere fornite nell'inizializzazione dell'oggetto SoapClient. –

-1

stessi suggerimenti:

  1. io uso SoapClient di connettersi con i servizi SSL, e tutto funziona bene senza specificare URL "punto finale". Quindi ti consiglio di provare senza questa opzione;

  2. php SoapClient ha un'opzione denominata "ssl_method" in cui è possibile 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" nell'elenco dei parametri;

+0

Grazie per la vostra risposta. '1:' Ho provato anche senza l'endpoint; senza fortuna. '2:' A causa della mia versione di PHP non riesco a usare ssl_method. '3:' Ho torto o sono verifypeer e verifyhost parametri non documentati (o almeno non sono nei documenti: http://php.net/manual/en/soapclient.soapclient.php). Nessuna differenza nel fornire loro neanche. – Ben

+0

'Specifica" verifypeer => false "e" verifyhost => false "nell'elenco dei parametri;' Ciò significa disabilitare la sicurezza. sempre una cattiva idea –