stream_socket_enable_crypto în PHP

Rețea PHP 5.1+

Pornește sau oprește criptarea TLS pe o conexiune deja deschisă (de exemplu după comanda STARTTLS la SMTP).

Sintaxă
stream_socket_enable_crypto($stream, bool $enable, ?int $crypto_method = null, $session_stream = null): int|bool

Ce face stream_socket_enable_crypto

Unele protocoale încep necriptat și trec la TLS pe aceeași conexiune: SMTP cu STARTTLS, IMAP, FTP explicit. stream_socket_enable_crypto face această trecere pe un socket deschis cu stream_socket_client.

Pentru clienți, metoda uzuală este STREAM_CRYPTO_METHOD_TLS_CLIENT. Certificatul serverului este verificat după opțiunile ssl din contextul stream-ului (de exemplu peer_name).

Parametri

Parametru Descriere
$stream Socket-ul deschis.
$enable true pornește criptarea, false o oprește.
$crypto_method Opțional. Metoda, de exemplu STREAM_CRYPTO_METHOD_TLS_CLIENT.
$session_stream Opțional. Un stream deja criptat de la care se preiau setările.

Ce returnează

true la succes, false la eșec, sau 0 dacă socket-ul este neblocant și negocierea nu s-a terminat încă.

Exemple

Exemplul 1: Conexiune TCP trecută pe TLS

<?php
$socket = stream_socket_client("tcp://www.dexblog.ro:443", $cod, $mesaj, 10);
stream_context_set_option($socket, "ssl", "peer_name", "www.dexblog.ro");

var_dump(stream_socket_enable_crypto($socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT));

fwrite($socket, "HEAD / HTTP/1.1\r\nHost: www.dexblog.ro\r\nConnection: close\r\n\r\n");
echo fgets($socket);
echo stream_get_meta_data($socket)["crypto"]["protocol"];

Rezultat real (necesită conexiune la internet)

bool(true)
HTTP/1.1 200 OK
TLSv1.3

Greșeli frecvente

  • Dezactivezi verificarea certificatului (verify_peer => false) ca să scapi de o eroare. Conexiunea poate fi interceptată fără să observi. Repară certificatele CA ale serverului.

Comenzi înrudite

  • curl_init / curl_setopt / curl_exec: Pregătește o cerere HTTP către alt server, de exemplu un API. Împreună cu curl_setopt și curl_exec, trimite cererea și primește răspunsul.
  • mail: Trimite un email folosind serverul de email configurat pe server (sendmail sau SMTP din php.ini).