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 — Habilita/deshabilita la encripción sobre un socket ya conectado
Descripción
Cuando es llamada con el parámetro tipo_cifrado , la función stream_socket_enable_crypto() preparará la encripción sobre la secuencia usando el método especificado.
Valores válidos para tipo_cifrado
- 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
Una vez se establecen los parámetros de encripción, la criptografía puede ser encendida y apagada dinámicamente pasando TRUE o FALSE en el parámetro habilitar .
Si esta secuencia debe ser alimentada con una semilla usando los parámetros de una secuencia ya establecida y con la encripción habilitada, ha de pasarse la variable de recurso de esa secuencia en el cuarto parámetro.
Devuelve TRUE en caso de éxito, FALSE si la negociación ha fallado o 0 si no hay suficientes datos y debe intentarse de nuevo (solo para sockets que no causan bloqueos).
Example #1 Ejemplo de stream_socket_enable_crypto()
<?php
$da = stream_socket_client("tcp://miproto.example.com:31337", $errno, $errstr, 30);
if (!$da) {
die("No fue posible conectarse: $errstr ($errno)");
}
/* Habilitar la encripcion para la fase de inicio de sesion */
stream_socket_enable_crypto($da, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT);
fwrite($da, "USER dios\r\n");
fwrite($da, "PASS secreto\r\n");
/* Apagar la encripcion para el resto */
stream_socket_enable_crypto($da, false);
while ($motd = fgets($da)) {
echo $motd;
}
fclose($da);
?>
OpenSSL Functions, y Lista de Transportes de Sockets Soportados
stream_socket_enable_crypto
06-Nov-2007 08:00
30-May-2007 12: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 ;-)
