web-dev-qa-db-ja.com

APNS + PHP "stream_socket_client():暗号化を有効にできませんでした"

PHPでAPNSを使用し、次のメッセージを取得するのに問題があります。

stream_socket_client(): Failed to enable crypto

問題は時々発生するだけで、他の場合は実際にプッシュを送信します。

私は10回の反復のループでテストスクリプトを持っているので、時々これを取得します。

stream_socket_client(): SSL: Connection reset by peer

サンドボックスサーバーを使用してテストしていますtls://gateway.sandbox.Push.Apple.com:2195

ここに私が試したものがあります:

  • PEMとすべての証明書を再発行しようとしました。
  • リクエストプロトコルsslv3://およびtls://
  • パスフレーズで遊んでみました(プッシュはパスフレーズなしで機能しました)
  • 私は解決策のためにstackoverflowを検索しようとしましたが、何も機能しませんでした。
  • チェックされたpemファイルの許可644
  • 確認されたpem親ディレクトリのパーミッション755

Googleで見つけたすべての解決策とSOは、すべてプッシュに問題がある人々です。

サービスはレート制限されているように感じますか?しばらく(約15分)待ってから再試行し、そのメッセージを再度取得し始めるまで約100のメッセージを正常にプッシュできたためです。

17
Samer

サンドボックスプッシュサービスはレート制限されています。私はテスト時にこれを経験しましたが、実稼働APIを使用してこのような制限に遭遇したことはありません。

あなたは彼らの他の保護を打っているかもしれません。

接続を開いて、メッセージを送信し、接続を閉じてからループを繰り返しますか?

これにより、通知がドロップされます。 Appleは、毎回新しい接続ではなく、同じ接続を使用して複数のプッシュ通知を送信することを望んでいます。

接続管理のベストプラクティス

同じゲートウェイまたは複数のゲートウェイインスタンスへの複数の接続を確立できます。多数のリモート通知を送信する必要がある場合は、それらを複数の異なるゲートウェイへの接続に分散させます。これにより、単一の接続を使用する場合と比べてパフォーマンスが向上します。リモート通知をより速く送信でき、APNがより速く配信できます。

複数の通知でAPNsとの接続を開いたままにします。 接続を繰り返し開いたり閉じたりしないでください。 APNsは、迅速な接続と切断をDoS攻撃として扱います。長時間アイドル状態になることがわかっている場合を除き、接続を開いたままにしておく必要があります。 1日1回ユーザーに通知を送信します。毎日新しい接続を使用してもかまいません。

From Apple Docs @ https://developer.Apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/CommunicatingWIthAPS.html

14
greg_diesel

私のPHPコードは次のエラーを生成していました:

PHP Warning:  stream_socket_client(): Failed to enable crypto in /private/tmp/t.php on line 12
PHP Warning:  stream_socket_client(): unable to connect to ssl://gateway.sandbox.Push.Apple.com:2195 (Unknown error) in /private/tmp/t.php on line 12
PHP Warning:  fclose() expects parameter 1 to be resource, boolean given in /private/tmp/t.php on line 24

問題は、いまいましい証明書が昨日前に失効したことでした! :-)これを信じられますか?

そのため、PEMファイルを再作成する必要があります。

5

PEMファイルを再作成する必要はありません

誤ったPassPhraseを使用すると、このエラーが発生します

エミリアーノ

1
Emiliano

Local_certのファイルパスを指定するときにファイル拡張子(.pem)を含めるのを愚かに忘れていたため、この問題が発生しました。

0
spybart

私の場合、問題は私のMac(OSX Sierra)にありました。 phpとcertをサーバーにアップロードして実行し、通知が配信されました。

0
stackOverFlew

チェックが少ない

  1. デバイストークンは-spacesなし、_<または>なし
  2. 証明書のパスが正しく、有効期限が切れていることを確認してください。
  3. 使用しているパスフレーズが証明書の作成に使用したものであることを確認してください
0
Bhavin Rana

この問題がありました。 .pemファイルの「全員」に書き込み許可を与えると消えました。

0
Toxic Brain