2024 年 PHP 日本研討會

網際網路網域:TCP、UDP、SSL 和 TLS

ssl://tls://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
  • sslv2://www.example.com
  • sslv3://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 V2 或 SSL V3 連線,具體取決於遠端主機的功能和偏好設定。sslv2://sslv3:// 將明確地選擇 SSL V2 或 SSL V3 協定。

新增備註

使用者貢獻的備註 2 則備註

christian at lantian dot eu
11 年前
@pablo dot livardo:我認為您發現的問題是由於用戶端/伺服器加密方法的差異所造成的。

連接埠 465 用於 SMTPS,伺服器在收到您的連線後立即開始加密。因此,您的程式碼可以正常運作。

連接埠 587 用於提交(MSA 或郵件提交代理),其工作方式類似於連接埠 25。伺服器接受您的連線,但不啟用加密。如果您想要在連接埠 587 上進行加密連線,您必須在沒有加密的情況下連線到該連接埠,您必須開始與伺服器對話(使用 EHLO),然後您必須要求伺服器使用 STARTTLS 命令啟動加密連線。伺服器啟動加密後,您也可以在用戶端啟動加密。

簡而言之,您不能使用

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

但您可以使用

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

在您發送 STARTTLS 命令後,您可以啟用加密

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

附註:我之前在此頁面上的備註完全錯誤,所以我要求 php.net 管理員將其移除。

:)
stefan at example dot com
14 年前
實際上,PHP 非常能夠先以未加密的連線啟動,然後再切換到加密連線 - 請參考 https://php.dev.org.tw/stream_socket_enable_crypto
To Top