我写了一个小的SIP客户端用于一个特殊的目的。基本上它连接到端口5060使用函数fsockopen()
$fp = fsockopen("10.0.0.1", 5060, $errno, $errstr, 30);
然后使用fread()
和fwrite()
读取和写入SIP命令。
现在我的SIP服务运营商希望我们的客户端使用SIPS,这基本上是SIP over TLS。我花了几个小时寻找如何使用PHP连接到TLS端口的信息,但没有任何成功。显然,fsockopen()
在一定程度上支持TLS,但当我将上面的内容替换为:
$fp = fsockopen("tls://10.0.0.1", 5061, $errno, $errstr, 10);
我什么都没得到。我可以从我的shell连接到服务器,使用OpenSSL客户端:
$ 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的推荐和工作方式是什么?
4条答案
按热度按时间lzfw57am1#
这足以打开TLS连接:
如果证书在其位置上,请按照Filippos链接的说明操作。
zzlelutf2#
我认为您的某些选项对于验证自签名证书是错误的;以下内容应足以使其工作:
3vpjnl9f3#
我最近遇到了这个错误,调试这里和那里的连接问题或代理问题,终于找到了罪魁祸首...和解决方案是安装php-pecl-crypto扩展。
我的机器是centos 7使用remi-repo的PHP
vlurs2pr4#
您还需要安装适当的证书才能使TLS正常工作。Check this SO question是如何将密钥文件用于常规TLS连接的示例。
此外,请检查RFC 5630中SIPS本身的规格。