ssl 在PHP中使用TLS建立连接

slhcrj9b  于 2022-12-04  发布在  PHP
关注(0)|答案(4)|浏览(177)

我写了一个小的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的推荐和工作方式是什么?

lzfw57am

lzfw57am1#

这足以打开TLS连接:

$context = stream_context_create();

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

如果证书在其位置上,请按照Filippos链接的说明操作。

zzlelutf

zzlelutf2#

我认为您的某些选项对于验证自签名证书是错误的;以下内容应足以使其工作:

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

3vpjnl9f3#

我最近遇到了这个错误,调试这里和那里的连接问题或代理问题,终于找到了罪魁祸首...和解决方案是安装php-pecl-crypto扩展。
我的机器是centos 7使用remi-repo的PHP

vlurs2pr

vlurs2pr4#

您还需要安装适当的证书才能使TLS正常工作。Check this SO question是如何将密钥文件用于常规TLS连接的示例。
此外,请检查RFC 5630中SIPS本身的规格。

相关问题