如何与PHP建立SSL连接

时间:2010-06-08 13:46:54

标签: php apache ssl openssl

我需要开发一个PHP类来与Apple服务器通信才能进行Push通知(APNS)。我有证书(.pem),我试图遵循在互联网上找到的各种教程但我仍然在尝试使用流套接字连接到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上被激活,因为我得到了“注册流套接字传输:tcp,udp,ssl,sslv3,sslv2,tls”和phpinfo()。 我的证书读得很好(PHP is_readable(certif.pem)在文件上返回true)

还有什么可以在Apache或PHP中激活才能让它工作吗?

3 个答案:

答案 0 :(得分:1)

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

为了使SSL能够与PHP一起工作,有两件事是重要的(如果你是从源代码编译PHP的话)

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

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

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

答案 1 :(得分:0)

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

请记住,您需要保持连接打开,这意味着PHP脚本在单次执行后不应退出,但基本上保持接近无限循环。在每次迭代时检查push的更改,写入套接字,sleep,repeat。

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/看起来很有希望。

答案 2 :(得分:0)

发现它!问题出在证书上。由于我自己没有创造它,我没有调查它,但我错了......

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

感谢您的帮助:)