php - 使用 TLS 在 PHP 中建立连接

标签 php ssl

我为特殊目的编写了一个小型 SIP 客户端。 基本上它使用函数 fsockopen()

连接到端口 5060
$fp = fsockopen("10.0.0.1", 5060, $errno, $errstr, 30);

然后基本上使用 fread()fwrite() 读写 SIP 命令。

现在我的 SIP 服务运营商希望我们的客户使用 SIPS 基本上是基于 TLS 的 SIP。我花了几个小时寻找信息 关于如何使用 PHP 连接到带有 TLS 的端口但没有任何 成功。显然 fsockopen() 在一定程度上支持 TLS 但 当我将上面的替换为:

$fp = fsockopen("tls://10.0.0.1", 5061, $errno, $errstr, 10);

我一无所获。我可以使用 OpenSSL 客户端从我的 shell 连接到服务器:

$ openssl s_client -connect 10.0.0.1:5061

而且我可以通过该连接毫无问题地与 SIP 服务器通信。 OpenSSL 支持在 PHP 中编译。

我的问题是我无法在 PHP 中与服务器建立 TLS 连接。我在一些论坛上注意到,在旧版本的 PHP 中,可以通过 fsockopen() 构建和使用 SSL 上下文,但显然不再是这样,因为我收到关于参数太多的错误。

我还尝试将 stream_context_create()stream_context_set_option() 一起使用,但我没有收到服务器的回复:

$context = stream_context_create();
$result=stream_context_set_option($context, 'ssl', 'verify_peer', 'TRUE');
$result=stream_context_set_option($context, 'ssl', 'cafile', 'cert.cer');
$result=stream_context_set_option($context, 'ssl', 'verify_depth', '5');

$fp = stream_socket_client('tls://'.$host.':'.$port, $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);

但我仍然无法从服务器获得任何回复或错误。在 PHP 中使用 TLS 的推荐方式和工作方式是什么?

最佳答案

这足以打开一个 TLS 连接:

$context = stream_context_create();

$fp = stream_socket_client('tls://'.$host.':'.$port, $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context)

如果证书就位。如果不是,请按照 Filippos 链接的说明进行操作。

关于php - 使用 TLS 在 PHP 中建立连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27201840/

相关文章:

php - Doctrine 2 查询返回的对象没有属性或方法

php - 使用 mysql 数据库中的数据过滤 ListView

windows - UWP 客户端上的 Odata 忽略 ssl

ssl - 将证书和 pkey 导入 jks 文件

ssl - 服务器可以向客户端发送多个证书吗?

php - 加密和解密数据库中的所有数据

javascript - 带有 ajax 的 PHP、jQuery、HTML 表单无法正常工作

php - simplexml_load_file() 错误

security - 没有 SSL 的网站显示不需要的广告,添加 SSL 后它们就消失了。是什么导致出现不需要的内容?

Tomcat 和缓存控制 : Private, 和过期 : <date in past> - Where is this set?