Just to avoid letting you search everywhere why your code doesn't work when using this function to enable crypto as a server, and when using TLS, you have to put the certificate in the "ssl" context, even if you start a TLS, SSLv3, etc.. server.
I had some troubles because of that...
stream_socket_enable_crypto
(PHP 5 >= 5.1.0)
stream_socket_enable_crypto — Active ou non le chiffrement, pour une socket déjà connectée
Description
Active ou non le chiffrement, pour une socket déjà connectée.
Une fois les paramètres de chiffrement définis, le chiffrement peut être activé et désactivé dynamiquement en passant TRUE ou FALSE dans le paramètre enable .
Liste de paramètres
- stream
-
La ressource de flux.
- enable
-
Active ou non le chiffrement sur le flux.
- crypto_type
-
Configure le chiffrement sur le flux. Les méthodes valides sont
- STREAM_CRYPTO_METHOD_SSLv2_CLIENT
- STREAM_CRYPTO_METHOD_SSLv3_CLIENT
- STREAM_CRYPTO_METHOD_SSLv23_CLIENT
- STREAM_CRYPTO_METHOD_TLS_CLIENT
- STREAM_CRYPTO_METHOD_SSLv2_SERVER
- STREAM_CRYPTO_METHOD_SSLv3_SERVER
- STREAM_CRYPTO_METHOD_SSLv23_SERVER
- STREAM_CRYPTO_METHOD_TLS_SERVER
- session_stream
-
Initialise le flux avec la configuration issue du paramètre session_stream .
Valeurs de retour
Retourne TRUE en cas de succès, FALSE si la négociation a échoué ou 0 s'il n'y a pas assez de données et que vous devez essayer encore (uniquement pour les sockets non-bloquantes).
Exemples
Exemple #1 Exemple avec stream_socket_enable_crypto()
<?php
$fp = stream_socket_client("tcp://myproto.example.com:31337", $errno, $errstr, 30);
if (!$fp) {
die("Impossible de se connecter : $errstr ($errno)");
}
/* Activation du chiffrement durant l'identification */
stream_socket_enable_crypto($fp, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT);
fwrite($fp, "USER god\r\n");
fwrite($fp, "PASS secret\r\n");
/* Désactivation du chiffrement pour le reste */
stream_socket_enable_crypto($fp, false);
while ($motd = fgets($fp)) {
echo $motd;
}
fclose($fp);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
stream_socket_enable_crypto
06-Nov-2007 07:00
30-May-2007 10:15
As already mentioned above:
stream_socket_enable_crypto is likely to fail/return zero if the socket is in non-blocking mode.
You may either wait some seconds until all neccessary data has arrived or switch temporary to blocking mode:
<?PHP
stream_set_blocking ($fd, true);
stream_socket_enable_crypto ($fd, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
stream_set_blocking ($fd, false);
?>
This works very fine for me ;-)
