使用TLS在PHP中建立连接

使用TLS在PHP中建立连接,php,ssl,Php,Ssl,我为特殊目的编写了一个小型SIP客户端。 基本上,它使用函数fsockopen() 然后基本上使用fread()和fwrite()读取和写入SIP命令 现在,我的SIP服务运营商希望我们的客户使用SIPS,这是 基本上是通过TLS进行SIP。我花了几个小时寻找信息 关于如何使用PHP连接到具有TLS的端口,但不使用任何 成功显然,fsockopen()在一定程度上支持TLS,但 当我将上述内容替换为: $fp = fsockopen("tls://10.0.0.1", 5061, $errno,

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

然后基本上使用
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\u context\u create()
stream\u context\u set\u 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正常工作。有关如何将密钥文件用于常规TLS连接的示例


另外,请检查SIPS本身的规格。

我认为您的一些选项在验证自签名证书时是错误的;以下内容足以使其发挥作用:

$context = stream_context_create([
  'ssl' => [
    'verify_peer' => true,
    'allow_self_signed' => true,
    'local_cert' => 'cert.cer',
  ],
]);

这足以打开TLS连接:

$context = stream_context_create();

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

如果证书在他们的位置上。如果不是,请按照Filipos链接的说明操作。

我最近遇到了这个错误,到处调试连接问题或代理问题,最终找到了罪魁祸首。。。解决方案是安装php pecl加密扩展


我的机器是centos 7,使用remi repo for PHP

顺便说一句,如果您在PHP中实现TLS(或SSL)连接,
stream\u set\u timeout
将无法工作(我正在从CLI运行PHP5.4.4)。我最终使用了
stream\u select
作为解决方案。如何提供证书和密码?
$context = stream_context_create();

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