【发布时间】:2015-01-27 21:23:12
【问题描述】:
我为特殊目的编写了一个小型 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 的推荐和工作方式是什么?
【问题讨论】: