PHP 8.5.4 Released!

Сокеты интернет-домена: TCP, UDP, SSL и TLS

Транспорты для сокетов интернет-домена: ssl://, tls://, sslv2:// и sslv3://.

Замечание: Транспорты sslv2:// и sslv3:// устарели. Документацию к этим транспортам сохранили только в целях обратной совместимости.

Замечание: Функции автоматически выберут транспорт tcp://, если другой не указали.

  • 127.0.0.1
  • fe80::1
  • www.example.com
  • tcp://127.0.0.1
  • tcp://fe80::1
  • tcp://www.example.com
  • udp://www.example.com
  • ssl://www.example.com
  • tls://www.example.com

Наряду с целевым адресом сокеты интернет-домена ожидают номер порта. При работе с функцией fsockopen() порт указывается вторым параметром и поэтому не влияет на формирование URL-адреса транспорта. При работе с функцией stream_socket_client() и другими функциями для работы с потоками, как и при работе с традиционными URL-адресами, номер порта указывается как суффикс — через двоеточие в конце транспортного URL-адреса.

  • tcp://127.0.0.1:80
  • tcp://[fe80::1]:80
  • tcp://www.example.com:80

Замечание: Числовые IPv6-адреса с номерами портов
Хотя во втором примере IPv4-адреса и имя хоста не изменились, за исключением добавления номера порта после двоеточия, IPv6-адрес обрамили квадратными скобками: [fe80::1]. Квадратные скобки помогают отличать двоеточия в IPv6-адресе и двоеточие, которое отделяет номер порта.

Транспорты ssl:// и tls://, которые доступны, только если PHP скомпилировали с поддержкой модуля openssl, — расширяют транспорт tcp:// для включения SSL-шифрования.

Транспорт ssl:// попытается согласовать безопасное SSL/TLS-соединение на основе протоколов и алгоритмов шифрования, доступных клиенту и удалённому хосту. Конкретные протоколы определяются конфигурацией библиотеки OpenSSL и параметрами функции stream_context_create() наподобие опции ssl.crypto_method.

Протоколы SSLv2 и SSLv3 устарели и небезопасны. Разработчики PHP и библиотеки OpenSSL больше не включают поддержку этих версий по умолчанию и настоятельно не рекомендуют обмениваться данным по устаревшим протоколам.

Добавить

Примечания пользователей 2 notes

up
16
christian at lantian dot eu
12 years ago
@pablo dot livardo  :  I think that the problem you found is caused by the difference between the client/server encryption methods used.

The 465 port is used for SMTPS, and the server starts the encryption immediately it receives your connection. So, your code will work.

The 587 port is used for Submission (MSA or Mail Submission Agent) which works like the port 25. The server accepts your connection and doesn't activate the encryption. If you want an encrypted connection on the port 587, you must connect on it without encryption, you must start to dialog with the server (with EHLO) and after that you must ask the server to start the encrypted connection using the STARTTLS command. The server starts the encryption and now you can start as well the encryption on your client. 

So, in few words, you can not use : 

<?php $fp = fsockopen("tls://mail.example.com", 587, $errno, $errstr);  ?>  

but you can use:

 <?php $fp = stream_socket_client("mail.example.com:587", $errno, $errstr); ?>  

and after you send the STARTTLS command, you can enable the crypto:

<?php stream_socket_enable_crypto($fp, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT); ?>

P.S. My previous note on this page was totally wrong, so I ask the php.net admin to remove it.

:)
up
6
stefan at example dot com
15 years ago
Actually, PHP is very able to start with an unencrypted connection and then switch to an encrypted one - refer to http://php.net/stream_socket_enable_crypto .
To Top