使用TLS在PHP中建立连接

时间:2014-01-29 13:05:11

标签: php ssl

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

连接到端口5060
$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);

我一无所获。我可以使用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的推荐和工作方式是什么?

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

这足以打开TLS连接:

$context = stream_context_create();

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

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

答案 2 :(得分:0)

您还需要安装相应的证书才能使TLS正常运行。 Check this SO question有关如何将密钥文件与常规TLS连接一起使用的示例。

另外,请在RFC 5630中查看SIPS本身的规格。

答案 3 :(得分:0)

我刚刚遇到这个错误,在这里和那里调试连接问题或代理问题,终于找到了罪魁祸首......解决方法是安装php-pecl-crypto扩展。

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