3 votes

fockopen : Échec de l'activation du cryptage

On a déjà répondu à des questions similaires, mais je n'ai pas réussi à résoudre ce cas particulier.

Sur une machine PHP 5.6+, lorsque j'essaie d'utiliser fsockopen sur un domaine particulier, je reçois ce qui suit (ce n'est pas le vrai domaine) :

$ php -r "var_dump(fsockopen(\"ssl://www.domain.net\", 9085, \$errnum, \$errstr, 5));"
PHP Warning:  fsockopen(): Failed to enable crypto in Command line code on line 1
PHP Warning:  fsockopen(): unable to connect to ssl://www.domain.net:9085 (Unknown error) in Command line code on line 1
bool(false)

Cela fonctionne bien sous PHP 5.5, ce qui indique que c'est dû au changement dans la version 5.6 concernant la façon dont fsockopen vérifie les certificats ssl.

D'autres connexions peuvent être effectuées sans problème :

$ php -r "var_dump(fsockopen(\"ssl://www.google.com\", 443, \$errnum, \$errstr, 5));"
resource(4) of type (stream)

Sur la base d'autres suggestions, j'ai vérifié le fichier cert par défaut.

$ php -r "print_r(openssl_get_cert_locations());"
Array
(
    [default_cert_file] => /usr/lib/ssl/cert.pem
    [default_cert_file_env] => SSL_CERT_FILE
    [default_cert_dir] => /usr/lib/ssl/certs
    [default_cert_dir_env] => SSL_CERT_DIR
    [default_private_dir] => /usr/lib/ssl/private
    [default_default_cert_area] => /usr/lib/ssl
    [ini_cafile] =>
    [ini_capath] =>
)

Le dossier /usr/lib/ssl/cert.pem manquait à l'origine, j'ai téléchargé le paquet ca depuis curl et l'ai renommé pour qu'il corresponde. Toujours pas de chance.

Je ne reçois aucune information supplémentaire indiquant que la vérification du certificat a échoué. Existe-t-il d'autres moyens de déboguer ce problème ?

2voto

user3545769 Points 36

Après de nombreux coups de tête, j'ai finalement découvert la cause.

PHP 5.6 implémente un jeu par défaut de chiffrement, qui supprime le support des anciens chiffrement plus vulnérables. http://php.net/manual/en/migration56.openssl.php

Les algorithmes de chiffrement par défaut utilisés par PHP ont été mis à jour avec une liste plus sécurisée basée sur les recommandations de Mozilla, avec deux exclusions supplémentaires : les algorithmes anonymes Diffie-Hellman, et RC4. Le domaine que j'ai essayé de connecter supporte actuellement TLSv1/SSLv3, Cipher RC4-MD5.

Pour contourner le problème, j'ai utilisé stream_socket_client au lieu de fsockopen. J'ai ajouté RC4-MD5 au support du chiffrement des flux dans le contexte :

$context = stream_context_create(['ssl' => [
  'ciphers' => 'RC4-MD5'
]]);

$socket = stream_socket_client('ssl://'.$host.':'.$port, $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X