2014-01-09 119 views
5

我已經使用衆所周知的Ray Wanderlich tutorial的php腳本在開發階段發送推送通知。在創建pem文件(來自p12和aps_development.cer文件)後,它們被正確觸發,並在php腳本中提到了設備標記。通過php腳本發送iOS通知:'無法設置私鑰文件'

但是,當我使用生產p12和aps_production.cer文件的pem文件時,通知甚至沒有到達APNS服務器。它在本地服務器端本身顯示下面的錯誤。

Unable to set private key file `/Users/administrator/Desktop/SimplePush/ck.pem' in /Users/administrator/Desktop/SimplePush/simplepush.php on line 22 

Warning: stream_socket_client(): failed to create an SSL handle in /Users/administrator/Desktop/SimplePush/simplepush.php on line 22 

Warning: stream_socket_client(): Failed to enable crypto in /Users/administrator/Desktop/SimplePush/simplepush.php on line 22 

Warning: stream_socket_client(): unable to connect to ssl://gateway.push.apple.com:2195 (Unknown error) in /Users/administrator/Desktop/SimplePush/simplepush.php on line 22 

可能是什麼原因呢。 p12文件沒有任何密碼(儘管我已經爲pem文件配置了一個密碼),這就是它在php腳本中給出的方式。

// Put your private key's passphrase here: 
$passphrase = ''; 
+0

你測試你推開服務器 – Retro

+0

鍵沒有,你可以給我就可以了更多的細節。 – OutOnAWeekend

+0

看看這裏爲使您的PEM文章http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1 – Retro

回答

5

這不是正確的p12文件。我從Keychain中導出了正確的p12文件,效果很好。

經驗教訓 -

  1. 如果使用不符合對方的P12和CER文件,顯然不會有串聯的PEM文件創建過程中表現出任何差錯。但是當你執行腳本時,會顯示一個錯誤。

  2. 上述錯誤消息不一定意味着p12文件的密碼不正確。它們也可能意味着p12文件不對應於使用的cer文件。

2

如果文件ck.pem確實存在於該位置,則可能是php腳本無法訪問它。我的文件夾/文件改變權限的東西更寬容,或者嘗試運行腳本作爲超級用戶:

sudo php simplepush.php 

編輯1:

一些研究它看起來像PEM文件後可能會出現意想不到的格式。您可以嘗試更改文件中組合的證書的順序。您還可以嘗試使用單獨的文件並使用'stream_context_set_option'函數指定每個文件。

編輯2:

如果可以的話,嘗試設置密碼爲您的生產文件的方式作爲教程一樣。它可能需要密碼才能運行。再一次,聽起來像pem文件有問題,或者生成不正確,缺少或格式錯誤。檢查文件。如果它不是安全風險,甚至可能會在你的問題中發佈。在弄清楚什麼是錯誤之後,你可以重新生成一個新的密鑰。

+0

做一個sudo運行給出了同樣的錯誤。我懷疑它是否與文件權限有關。如果我使用開發的ck.pem文件,它運行良好。它只與生產pem文件,我正面臨這個錯誤。 – OutOnAWeekend

+0

For Development - p12和pem文件都有相同的密碼。對於生產 - p12文件沒有密碼,並且pem文件有密碼。由於p12文件沒有密碼,我在php腳本中給出了一個空字符串。 (試圖與返回鍵以及PEM文件的密碼。) – OutOnAWeekend

1

我遇到了同樣的問題,我使用1234作爲密碼。 而不是寫$ passphrase ='1234'; 我寫成$ passphrase = 1234;並且工作正常

+0

真的好點 – Pawan

0

務必確保您的不使用舊的APNS代碼(例如,您正在爲開發和生產應用程序使用相同的數據庫表)。這會導致Apple APNS服務斷開連接,因爲它收到無效的APNS代碼,因爲不同的APNS代碼用於開發和實際發佈的應用程序。

另一句話:不要忘了,如果你發佈你的應用在AppStore重新生成密鑰對。開發證書不適用於生產!

2

如果運行在命令行的文件也許嘗試給予完整路徑ck.pem文件

更改的行: stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');

stream_context_set_option($ctx, 'ssl', 'local_cert', '/path/to/your/file/ck.pem');

+0

我不知道爲什麼它需要的完整路徑,但首先它解決了我的問題。已經浪費了6小時來解決問題。非常感謝你。提高你的答案。 :) – milanpanchal

+0

嗨,完整路徑是必需的,因爲從CMD的PHP運行從目錄運行的腳本 鍵入「pwd」 在控制檯獲取當前目錄位置 – ron

+0

最初它工作,突然它是停止工作。但現在所有工作都在工作之上。 – milanpanchal

3

設置$passphrase = '1234'到工作解決了我的問題。

+2

這怎麼可能是原因? – codepushr

+0

男人和這個答案有一個Upvote!和@Frustationiphone你不能把你的密碼告訴世界,並且永遠不要這麼簡單。 – rptwsthi