互联网域: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 地址中使用的冒号和用于分隔端口号的冒号。

当 openssl 支持编译到 PHP 中时,ssl://tls:// 传输(仅可用)是 tcp:// 传输的扩展,其中包括 SSL 加密。

ssl:// 将尝试协商 SSL V2 或 SSL V3 连接,具体取决于远程主机的功能和首选项。 sslv2://sslv3:// 将显式选择 SSL V2 或 SSL V3 协议。

添加说明

用户贡献说明 4 个说明

christian at lantian dot eu
10 年前
@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
13 年前
实际上,PHP 非常能够从未加密连接开始,然后切换到加密连接 - 请参阅 https://php.net/stream_socket_enable_crypto
christian at lantian dot eu
10 年前
@pablo dot livardo:我认为您发现的问题是由客户端/服务器使用的加密方法之间的差异造成的。

您尝试使用 TLS 加密访问端口 587,但服务器在此端口上使用 SSLv3 加密。

您可以通过端口 465 与 Google 服务器通信,因为在此端口上通信使用 TLS 加密,并且您的客户端配置为识别 TLS。

因此,如果您想通过端口 587 连接到 Google 服务器,您只需编写

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

而不是

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

:)
pablo dot livardo at gmail dot com
14 年前
我一直遇到 TLS 连接问题。

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

这给了我一个错误

SSL 操作失败,代码为 1。 OpenSSL 错误消息:错误:1408F10B:SSL 例程:SSL3_GET_RECORD:错误的版本号

我认为这是由于 PHP 无法从未加密连接开始,然后切换到加密,即使该功能内置于 OpenSSL。

对于 Google Mail 用户,您可以通过使用端口 465 而不是 587 来避免这种情况。
To Top