Π‘ΠΎΠΊΠ΅Ρ‚Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-Π΄ΠΎΠΌΠ΅Π½Π°: 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
5
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 .