【问题标题】:How can I do an SSL connection with PHP如何使用 PHP 建立 SSL 连接
【发布时间】:2011-03-01 04:22:16
【问题描述】:

我需要开发一个 PHP 类来与 Apple 服务器进行通信,以便进行推送通知 (APNS)。我有证书 (.pem),我尝试按照 Internet 上的各种教程进行操作,但尝试使用流套接字连接到 ssl://gateway.sandbox.push.apple.com:2195 时仍然出错:

$apnsHost = 'gateway.sandbox.push.apple.com';
$apnsPort = 2195;
$apnsCert = 'apns-dev.pem';
$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
$apns = stream_socket_client('ssl://'.$apnsHost.':'.$apnsPort, $error, $errorString, 2,
STREAM_CLIENT_CONNECT, $streamContext);

此 URL 上的 telnet 有效,因此端口 2195 已打开。 Openssl 在 PHP 上被激活,因为我得到了带有 phpinfo() 的“Registered Stream Socket Transports : tcp, udp, ssl, sslv3, sslv2, tls”。 我的证书读得很清楚(PHP is_readable(certif.pem) 在文件上返回 true)

还有什么可以在 Apache 或 PHP 中激活以使其工作吗?

【问题讨论】:

  • 另外,你提到了一个错误。究竟是什么错误?
  • 是否有更详细的错误显示? (检查您的错误报告级别)
  • 正如我在下面写的,错误如下: [function.stream-socket-client]: Unable to set local cert chain file `editus_dev_push.pem'; [function.stream-socket-client]:无法创建 SSL 句柄 [function.stream-socket-client]:无法启用加密 [function.stream-socket-client]:无法连接到 ssl://gateway。 sandbox.push.apple.com:2195(未知错误)
  • 确保 apache 有权访问 .pem
  • 我想是的,我在 Windows XP 下运行我的开发并且文件不是只读的。

标签: php apache ssl openssl


【解决方案1】:

我的第一条评论是你不会使用 apache。要与 APNS 通信,您必须将 PHP 脚本作为 shell 脚本(基本上是守护程序)运行。您需要打开与苹果服务的套接字连接。请参阅 socket_connect() http://www.php.net/manual/en/function.socket-connect.php 以开始使用。

请记住,您需要保持连接打开,这意味着 PHP 脚本不应在单次执行后退出,但基本上保持近乎无限的循环。在每次迭代中检查是否有更改推送、写入套接字、休眠、重复。

Apple 的开发者网站上有大量信息。从这里开始http://developer.apple.com/iphone/library/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingWIthAPS/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW1

用谷歌搜索一下APNS with PHP 产生了一些结果,其中一个是http://code.google.com/p/php-apns/,看起来很有希望。

【讨论】:

  • 哼我不明白为什么我需要让连接打开?如果我只想打开连接,发送一个通知然后关闭连接怎么办?或者更具体地针对我的情况,每周执行一次我的 PHP 脚本以将新闻发送到我的 iphone 应用程序。我已经进行了此类搜索,并且正在使用 APNS PHP
  • 在我提供给苹果网站的链接上,-Note- 框正下方有一行:“您还应该在多个通知中保留与 APNs 的连接。APNs 可能会考虑快速且重复建立的连接,并且“作为拒绝服务攻击被拆除。发生错误时,APNs 会关闭发生错误的连接。”在您的情况下,我想每周重新创建一次连接并不可怕,但请注意。
  • 好的,我记住了这一点。那是因为我已经在使用 APNS PHP 代码,而且我认为我在 PHP 方面做得很好,所以我开始认为这可能是 Apache 的问题......
  • 你是如何“执行”你的脚本的?通过在您的网络浏览器中发出请求?您是否将信息输入到您想要推出的文本框中?正如我在上面问的那样,您收到的错误是什么?
  • 我正在我们的浏览器中执行脚本,并且要发送的消息目前是硬编码的。所以在浏览器中调用我的脚本执行脚本,所以连接让我出现以下错误:[function.stream-socket-client]:无法设置本地证书链文件`editus_dev_push.pem'; [function.stream-socket-client]:无法创建 SSL 句柄 [function.stream-socket-client]:无法启用加密 [function.stream-socket-client]:无法连接到 ssl://gateway。 sandbox.push.apple.com:2195(未知错误)
【解决方案2】:

找到了!问题出在证书上。由于不是我自己创建的,所以我没有调查它,但我错了......

我决定按照以下说明正确地自己重新生成它:Error using ssl cert with PHP 并且它有效!

感谢您的帮助:)

【讨论】:

    【解决方案3】:

    不完全在主题上,但值得一提:

    为了使 SSL 与 PHP 一起工作,有两件事很重要(如果您从源代码编译 PHP)

    1) 确保安装了 openssl base 和 devel 包 例如yum install openssl openssl-devel

    2) 使用 openssl 支持编译 PHP: 即在运行配置时使用 --with-openssl 选项。

    然后,ssl 会出现在 phpinfo() 的“Registered Stream Socket Transports”中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-01
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 2021-05-26
      • 2016-09-20
      • 1970-01-01
      • 2018-11-09
      相关资源
      最近更新 更多