【问题标题】:Making a connection in PHP using TLS使用 TLS 在 PHP 中建立连接
【发布时间】:2015-01-27 21:23:12
【问题描述】:

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

$fp = fsockopen("10.0.0.1", 5060, $errno, $errstr, 30);

然后基本上使用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_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 的推荐和工作方式是什么?

【问题讨论】:

    标签: php ssl


    【解决方案1】:

    这足以打开一个 TLS 连接:

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

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

    【讨论】:

    • 顺便说一句,如果您在 PHP 中实现 TLS(或 SSL)连接,stream_set_timeout 将不起作用(我从 CLI 运行 PHP 5.4.4)。我最终使用stream_select 作为解决方法。
    • 如何提供证书和密码?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您还需要安装适当的证书才能使 TLS 正常工作。 Check this SO question 举例说明如何将密钥文件与常规 TLS 连接一起使用。

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

      【讨论】:

        【解决方案4】:

        我最近才遇到这个错误,到处调试连接问题或代理问题,终于找到了罪魁祸首……解决办法是安装php-pecl-crypto扩展。

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

        【讨论】:

          猜你喜欢
          • 2011-10-06
          • 2021-11-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-21
          • 2015-04-04
          相关资源
          最近更新 更多