2016-09-21 152 views
13

我试图用简单的PHP工具,它连接到ssl://gateway.push.apple.com:2195送我的手机推送通知,但连接失败,出现以下错误:的APN推送通知和MacOS塞拉利昂

Warning: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages: 
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in <Users/.../file.php> on line 30 

Warning: stream_socket_client(): Failed to enable crypto in <Users/.../file.php> on line 30 

Warning: stream_socket_client(): unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Unknown error) in <Users/.../file.php> on line 30 
Failed to connect: 0 

,因为这一切都开始我升级为macOS Sierra的转基因种子。 macOS Sierra中有哪些新特性影响SSL连接? 我该如何解决这个问题?

+0

首先你尝试检查推送通知的凭证档案错误使用一些APNS测试仪的工作,如果你得到那么所有的通知如果没有,那么你必须从两边检查。您可以使用此网站进行测试http://pushtry.com/ – ashmi123

+0

完全相同的文件夹(具有证书等)在OS X Mavericks中运行良好,但在macOS Sierra中运行得并不理想。我认为基本上问题是找到证书('.pem')文件的路径。我试图提供绝对路径以及相对路径,并且都没有尝试过。 –

+0

你有没有尝试使用这个网站? – ashmi123

回答

11

我得到了同样的错误,这就是我所做的:

1)更新了我的OpenSSL (我觉得你不需要这个)有步骤2,会导致这将需要大约10分钟

brew install openssl 

确保ü更新其正确:

openssl version 

如果没有,试试这个或者google:

brew link --force openssl 

2)检查该php default_cert_file路径:

php -r "print_r(openssl_get_cert_locations());" 

这是我的了:

Array 
(
[default_cert_file] => /usr/local/libressl/etc/ssl/cert.pem 
[default_cert_file_env] => SSL_CERT_FILE 
[default_cert_dir] => /usr/local/libressl/etc/ssl/certs 
[default_cert_dir_env] => SSL_CERT_DIR 
[default_private_dir] => /usr/local/libressl/etc/ssl/private 
[default_default_cert_area] => /usr/local/libressl/etc/ssl 
[ini_cafile] => 
[ini_capath] => 
) 

3)从这里下载cacert.pem:

wget http://curl.haxx.se/ca/cacert.pem 

4)将cacert.pem文件移动到您的default_cert_file路径(以root身份):

sudo mv cacert.pem /usr/local/libressl/etc/ssl/cert.pem 

可能我需要创建这个目录第一

在此之后,我的PHP脚本工作。

+0

工作就像一个魅力!谢谢TONNE! –

+0

谢谢。为我节省了很多时间。 – NKorotkov

+0

感谢您的快速指示! – anders

12

升级到macOS Sierra后,我得到了同样的错误,同时使用php script to send push notifications

解决方案与安装证书

[default_cert_file] => /usr/local/libressl/etc/ssl/cert.pem没有很好的帮助。


更新到PHP诉27年6月5日,MACOS塞拉利昂10.12.4


而且毕竟,我发现我的问题。事实上,macOS Sierra将PHP版本更新至5.6版本。27

要检查它,输入端子

php -v

PHP 5.6.27 (cli) (built: Oct 23 2016 11:47:58) 
Copyright (c) 1997-2016 The PHP Group 
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies 

这里是OpenSSL changes in PHP 5.6.x

由于短暂的解决办法,有人建议在PHP脚本禁用全新的安全功能(在上面的链接中,非常底部)。

更安全(和我推荐它)将是一个方法来设置路径entrust_2048_ca.cer明确像

$streamContext = stream_context_create([ 
      'ssl' => [ 
       'verify_peer'  => true, 
       'verify_peer_name' => true, 
       'cafile'   => '/path/to/bundle/entrust_2048_ca.cer', 
      ] 
     ]); 

它的工作原理也是如此。

+0

我不确定**'verify_peer'=> false **是安全的决定,第二个是好的,谢谢! – protuberian

+0

感谢兄弟,你救了我的命.. p.s:macsiera ...那太糟糕了。 – Giang

0

加入到由@Sandar给出的答案,你也可以这样设置

stream_context_set_option($streamContext, 'ssl', 'cafile', '/path/to/entrust_2048_ca.cer'); 
相关问题