2016-09-21 71 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'); 
相關問題