Je me bats contre ce problème depuis un certain temps et je n'arrive pas à le résoudre. Pour commencer, c'est la première fois que j'ai à travailler avec SSL. Le serveur sur lequel je travaille utilise PHP 5.6.30 et Laravel 5.1.46, et j'essaie d'utiliser GuzzleHttp 6.2.3 pour envoyer du JSON à un tiers. Jusqu'à présent, j'ai désactivé la vérification ssl en spécifiant 'verify' => false
au sein du client, et ont pu obtenir des réponses satisfaisantes. La tierce partie m'a fourni un certificat à utiliser, et m'a donné les deux formats .pem et .cer. Ils ont déclaré que le certificat n'est pas protégé par un mot de passe puisqu'il s'agit de la clé publique. Selon la documentation de GuzzleHttp, ma requête devrait ressembler à ceci :
$response = $client->request('POST', $endpoint, [
'cert' => /path/to/new/cert.pem,
'headers' => [
'Content-type' => 'application/json'
],
'body' => $request_body,
'connect_timeout' => 5,
]);
Je ne peux pas me connecter en utilisant cette méthode et, malheureusement, je ne peux pas obtenir les détails de l'erreur de bas niveau en raison de la conception du serveur sur lequel je travaille (il s'agit d'une importante base de code préexistante que je dois mettre à jour et qui sera, je l'espère, complètement réécrite).
Afin d'obtenir plus de détails, j'ai décidé d'envoyer la requête en utilisant cURL. J'ai d'abord envoyé la requête sans le certificat :
// REQUEST
curl -v -H "Content-Type: application/json" -X POST -d '{"some_json_request": "value"}' https://sometargeturl.com:8443/dosomething
// OUTPUT
* Trying 204.71.178.10...
* TCP_NODELAY set
* Connected to sometargeturl.com (204.71.178.10) port 8443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* Server certificate:
* subject: CN=sometargeturl.com,OU=OU,O="Some Company Name, Inc",L=Pleasanton,ST=California,C=US
* start date: May 13 00:00:00 2016 GMT
* expire date: May 14 23:59:59 2018 GMT
* common name: sometargeturl.com
* issuer: CN=Symantec Class 3 Secure Server CA - G4,OU=Symantec Trust Network,O=Symantec Corporation,C=US
* NSS error -8179 (SEC_ERROR_UNKNOWN_ISSUER)
* Peer's Certificate issuer is not recognized.
* Curl_http_done: called premature == 1
* Closing connection 0
curl: (60) Peer's Certificate issuer is not recognized.
Ensuite, avec le certificat :
// REQUEST
curl -v --cert /path/to/the/cert.pem -H "Content-Type: application/json" -X POST -d '{"some_json_request": "value"}' https://sometargeturl.com:8443/dosomething
// OUTPUT
* Trying 204.71.178.10...
* TCP_NODELAY set
* Connected to sometargeturl.com (204.71.178.10) port 8443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* unable to load client key: -8178 (SEC_ERROR_BAD_KEY)
* NSS error -8178 (SEC_ERROR_BAD_KEY)
* Peer's public key is invalid.
* Curl_http_done: called premature == 0
* Closing connection 0
curl: (58) unable to load client key: -8178 (SEC_ERROR_BAD_KEY)
J'ai fait une tonne de recherches et je n'ai pas réussi à trouver une solution. Je ne suis vraiment pas sûr des prochaines étapes à suivre à ce stade. J'aurai finalement besoin d'utiliser GuzzleHttp pour envoyer la requête, mais je ne sais pas ce qui me manque. J'ai lu qu'il était possible d'ajouter le nouveau certificat à un ensemble d'autorités de certification existant, mais je ne sais pas si c'est la bonne solution et, le cas échéant, comment je dois m'y prendre. Toute aide serait appréciée, merci !