我出于特殊目的编写了一个小型 SIP 客户端。
基本上它使用函数连接到端口 5060fsockopen()
$fp = fsockopen("10.0.0.1", 5060, $errno, $errstr, 30);
然后基本上使用读取和写入SIP命令fread()
and fwrite()
.
现在我的 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 中,可以通过以下方式构建和使用 SSL 上下文:fsockopen()
但显然不再是了,因为我收到了关于太多参数的错误。
我也尝试过使用stream_context_create()
with 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 的推荐和工作方式是什么?