PHP 大会日本 2024

互联网域名: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:// 传输(仅在将 openssl 支持编译到 PHP 中时可用)是 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.net/stream_socket_enable_crypto
To Top