2010-09-27 33 views
4

J'ai reçu deux fichiers de certificat du fournisseur, un dans un format .cer et un dans un format .p7b. J'ai ensuite converti le certificat p7b en un certificat p12. Avec ce certificat, je suis capable de me connecter au wsdl depuis mon navigateur. Ensuite, j'ai procédé à la conversion de ce certificat au format .pem, en suivant les instructions que j'ai trouvées sur ce site.Problème de connexion au service Web crypté SSL avec PHP

openssl pkcs12 -clcerts -nokeys -out test.pem -in mycert.p12 
openssl pkcs12 -nocerts -out key.pem -in mycert.p12 

peignage alors le cert avec la clé en utilisant la commande suivante:

cat test.pem key.pem > cert.pem 

Heres ma construction pour la classe de service Web:

public function __construct() { 
    $wsdl_url = 'https://url.to/web_service?wsdl'; 
    $pass = 'passphrase'; 
    $cert = 'cert.pem'; 

    try { 
     $this->client = new SoapClient($wsdl_url, array('local_cert' => $cert, 'passphrase' => $pass)); 
    } catch(SoapFault $e) { 
     print_r($e); 
    } 
} 

Et voici l'erreur:

SSL operation failed with code 1. OpenSSL Error messages: error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca in /var/www/html/.. 

Essayer de vérifier le certificat en utilisant:

openssl verify cert.pem 

me donne l'erreur suivante:

error 20 at 0 depth lookup:unable to get local issuer certificate 

J'ai aussi essayé de créer le certificat .pem en utilisant la commande openssl suivante:

openssl pkcs12 -in mycert.p12 -out mycert.pem 

Vérification cela me donne OK, mais PHP me donne l'erreur suivante:

Unable to set local cert chain file `mycert.pem'; Check that your cafile/capath settings include details of your certificate and its issuer 

Je suppose qu'il devrait être possible de le faire fonctionner d'une manière ou d'une autre, étant donné que je peux accéder au wsdl via mon navigateur, en utilisant le certificat .p12. Mais je ne suis pas en mesure de trouver une solution quant à la façon dont je devrais procéder. Merci d'avance.

Répondre

0

Je pense que vous avez quelques problèmes ici. Premièrement, je ne pense pas que vos options pour le certificat local sont utilisées par le constructeur pour l'objet SoapClient. Le tableau d'options ne prend pas en charge les options de configuration SSL. Deuxièmement, étant donné que les options que vous fournissez à SoapClient ne sont pas utilisées, Open SSL se plaint que le certificat sur l'hôte distant soit un certificat auto-certifié.

Je pense qu'il devrait être possible de contourner cela, mais sans jouer avec le code, je ne peux pas être sûr de toutes les options. Je pense que vous devez créer un contexte de flux personnalisé en utilisant stream_context_create() pour définir les options SSL dont vous avez besoin (jetez un oeil à http://ca.php.net/stream_context_create et les options de contexte pour SSL). Cela peut ensuite être passé à l'objet SoapClient en tant qu'option stream_context dans le tableau config. En utilisant stream_context, vous pouvez définir les différentes options SSL dont vous avez besoin et celles-ci remplacent les valeurs par défaut.

Je suis désolé, je ne peux pas être plus précis sur les options que vous devez définir. Espérons que jouer avec le contexte du courant résoudra votre problème.

0

Je pense qu'il est impossible de trouver le certificat racine qui a émis le certificat que vous avez reçu.

Les certificats sont normalement signés et émis par un signataire autorisé, et votre client doit connaître la clé publique de l'autorité de signature. Si votre certificat est un certificat auto-signé, cela n'aura aucune importance.

Pour vérifier openssl x509 -text -noout -in key.pem

Vérifiez la sortie et chercher l'émetteur. Si l'émetteur n'est pas le même que le CN du certificat, vous avez besoin d'un certificat racine de l'autorité de signature qui a fourni votre certificat.

Vous pouvez normalement l'attraper en utilisant un navigateur pour ouvrir votre adresse wsdl et vérifier la chaîne de certificats et exporter le certificat racine à partir de l'onglet de la hiérarchie.

Lorsque vous l'enregistrez dans votre situation, je ne suis pas sûr, mais il y aura quelque chose à pointer vers un magasin de confiance d'un certain type.