cURL avec les certificats SSL échoue: erreur 58 impossible de définir le fichier de clé privée
Je suis en train d'essayer de vous connecter à un hôte distant à l'aide de cURL. La connexion nécessite l'utilisation d'un certificat et une clé privée qui est protégé par mot de passe. Jusqu'à présent, je suis échoué avec ce code ci-dessous:
<?php
$wsdl = 'https://domain.com/?wsdl';
$certFile = getcwd() . '/auth/cert.pem';
$keyFile = getcwd() . '/auth/key.pem';
$password = 'pwd';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $wsdl);
curl_setopt($ch, CURLOPT_SSLCERT, $certFile);
curl_setopt($ch, CURLOPT_SSLKEYPASSWD, $password);
curl_setopt($ch, CURLOPT_SSLKEY, $keyFile);
#curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
#curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
#curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$output = curl_exec($ch);
var_dump(curl_errno($ch));
var_dump(curl_error($ch));
Le résultat, je reçois des erreurs 58
: unable to set private key file: '/home/.../domains/.../public_html/auth/key.pem' type PEM
.
Choses que j'ai essayé jusqu'à présent:
- Vérifier si le fichier est lisible comme suggéré ici: Impossible d'utiliser libcurl pour accéder à un site nécessitant l'authentification du client. En essayant de passer le fichier à l'aide
openssl_private_key()
me donne une ressource, et pas un booléen. Si cela semble bon. - Changer l'ordre de la contenu de la clé.fichier pem comme suggéré ici: Impossible d'utiliser libcurl pour accéder à un site nécessitant l'authentification du client. Pas de chance jusqu'à présent.
- Joué un peu avec quelques autres options comme
SLL_VERIFY_PEER
,SSL_VERIFY_HOST
,SSL_CERTTYPE
et d'autres options qui semblait trivial concernant la officielle de PHP-docs. Pas de chance jusqu'à présent.
Je suis sûr que le problème se situe quelque part dans ma configuration, mais je ne sais pas où chercher.
- "Changer l'ordre de la contenu de la clé.pem". Vous
key.pem
fichier (qui contient la clé privée) ne devrait vraiment contenir 1 codés en PEM section (pour la clé privée). C'est l'ordre de la cert fichier que vous pourriez avoir besoin de changer. Le client-cert pour cette clé privée doit être en haut.
Vous devez vous connecter pour publier un commentaire.
J'ai corrigé ce problème. Je pense que, en raison du nombre de questions au sujet de cette question et le nombre de solutions différentes, d'autres profiteront de la solution. Va ici:
J'ai utilisé le
openssl
programme en ligne de commande pour convertir le .p12 fichier-clé à un .pem clé de fichier. Le truc, c'est le chemin de la conversion.J'ai d'abord converti avec cette commande et j'ai eu la question, telle que décrite dans la question:
openssl pkcs12 -in key.p12 -out key.pem -nodes -clcerts
Alors que la commande ci-dessous fait la réelle astuce:
openssl pkcs12 -in key.p12 -out key.pem -clcerts
Pour plus d'informations s'il vous plaît voir la source que j'ai utilisé: https://community.qualys.com/docs/DOC-3273
-nodes
enlève le cryptage de la clé, qui peut entrer en conflit avec vous essayez d'utiliser un mot de passe dans ce cas.Juste au cas où c'est utile pour d'autres personnes à la recherche pour ce problème, j'ai fini par découvrir que CURLOPT_SSLCERT et CURLOPT_SSLKEY ne semble pas fonctionner avec des chemins relatifs.
C'est avec WAMP, php version 5.5 sur Windows.