Nur von PHP: es konnte keine Verbindung APNS gateway.push.apple.com:2195
Es ist ein spät in die Nacht. Ich verbrachte 10 Stunden im google/stackoverflow suchen und Experimente. Und scheint, ich hasse Apple Push-Benachrichtigungen. Ich bin Total frustriert und werde für jede Hilfe dankbar.
Danke.
Das problem:
Den PHP code für das senden von Apple Push-Benachrichtigungen, die Sie erfolgreich gearbeitet, vor zwei Wochen aufgehört zu arbeiten, jetzt und wirft folgenden Fehler:
PHP Warning: stream_socket_client(): Failed to enable crypto in /home/...
PHP Warning: stream_socket_client(): unable to connect to ssl://gateway.push.apple.com:2195 (Unknown error) in /home/...
Es aufgehört zu arbeiten auf zwei getrennten Servern, die mit separater scripts für den APNs zu senden.
Umgebung:
Server: CentOS 6.5 mit PHP 5.4.32 und Ubuntu 14.04.3 mit PHP 5.5.9
APN: Im Produktionsmodus
Zertifikate: getestet mit 700+ push-Benachrichtigungen.
Einer der Server ist mit https://github.com/immobiliare/ApnsPHP, andere - https://github.com/antongorodezkiy/wp-apn, auf localhost getestet habe ich Sie einfach Datei ohne Verwendung jeglicher third-party-code.
Untersuchung:
Für alle nachstehend aufgeführten Fällen habe ich die gleichen aktiven Geräte-token und der gleichen Produktions-PEM-Zertifikat.
php
Aber selbst dieser einfache code nicht funktioniert auf beide Server und localhost und wieder den gleichen Fehler wie oben:
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', '/absolute/path/to/apn_prod.pem');
//Open a connection to the APNS server
$fp = stream_socket_client(
'ssl://gateway.push.apple.com:2195', $err,
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
Ich auch versucht zu spielen mit stream_context_set_option()
Optionen, gehören entrust_2048_ca.cer
etc, und auch einige Optionen aus dieser Artikel. Obwohl der code funktioniert ohne änderungen, bevor August 2015.
openssl
Verbindung gearbeitet mit openssl (link):
openssl s_client -connect gateway.push.apple.com:2195 -cert /absolute/path/to/apn_prod.pem -debug -showcerts -CAfile /absolute/path/to/server-ca-cert.pem
Und bekam mit CONNECTED(00000003)
und Verify return code: 0 ( ok )
.
telnet
Verbindung gearbeitet mit telnet:
-sh-4.1$ telnet gateway.push.apple.com 2195
Trying 17.172.233.150...
Connected to gateway.push.apple.com.
pecl apn
Es nicht senden push-Benachrichtigung. Ich habe gerade versucht die Anpassung von Beispiel-code, aber habe den Fehler Invalid token
. Der token ist aktiv und gleichen token, die ich überall eingesetzt und für Houston und Ruby auch.
houston
Es funktionierte mit Houston
apn push "0346a53f...231d9d6abe11" -c /absolute/path/to/apn_prod.pem -m "Hello from the command line!" -e "production"
ruby
Ich bin nicht ein Ruby-Programmierer (noch zumindest), aber nach dem Erfolg mit Houston, die ich gefunden und angepasst Ruby-code, ohne Houston Abhängigkeit.
Und es funktionierte:
#!/usr/bin/env ruby
require 'openssl'
require 'socket'
require 'json'
token = "0346a53f...231d9d6abe11"
cert = File.read("/absolute/path/to/apn_prod.pem")
ctx = OpenSSL::SSL::SSLContext.new
ctx.key = OpenSSL::PKey::RSA.new(cert, '') #set passphrase here, if any
ctx.cert = OpenSSL::X509::Certificate.new(cert)
sock = TCPSocket.new('gateway.push.apple.com', 2195) #development gateway
ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
ssl.connect
payload = {"aps" => {"alert" => "Oh hai!", "badge" => 1, "sound" => 'default'}}
json = payload.to_json()
token = [token.delete(' ')].pack('H*') #something like 2c0cad 01d1465 346786a9 3a07613f2 b03f0b94b6 8dde3993 d9017224 ad068d36
apnsMessage = "\0\0 #{token}\0#{json.length.chr}#{json}"
ssl.write(apnsMessage)
ssl.close
sock.close
puts "End"
Fragen:
- Was ist falsch mit PHP? Gibt es einige Fehler im Zusammenhang mit diesem Thema? (Empfinde ich nicht als bug-report)
- Irgendwelche Ideen wie man dieses Problem lösen?
- Irgendwelche Ideen, was könnte der Unterschied in PHP und Ruby-Fällen (ich gehe davon aus, dass Python oder Perl arbeiten konnte, auch in Ordnung)? Ich habe sogar versucht zu Lesen, PHP-Quellen, aber ohne Erfolg, zu verstehen, wie
stream_socket_client()
umgesetzt werden.
Bitte helfen.
ja, ich habe es behoben. Überprüfen Sie bitte meine Antwort ( stackoverflow.com/a/33015070/741782 ) und danke für die Erinnerung mich über dieses ticket
InformationsquelleAutor antongorodezkiy | 2015-08-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe das Problem entdeckt und behoben.
Den problem war .pem-Zertifikat. Irgendwie gab es zwei Zertifikate in einer Datei für Produktion und Entwicklung .pem-Dateien. Das gleiche .pem-Datei mit zwei Zertifikaten war in den repo für eine lange Zeit, aber APNs aufgehört zu arbeiten, nur wenigen Monaten. Vielleicht wurde etwas aktualisiert/geändert auf der Apple Seite.
Ich nehme an, die Ruby-code irgendwie entfernt Zertifikat Vervielfältigung oder vielleicht brauchte es nur das erste Zertifikat, damit es funktioniert in Ruby.
Jedoch die Lösung wurde, entfernen Sie das zweite Zertifikat aus .pem-Datei. Danach APNs angefangen zu arbeiten, und Sie arbeiten jetzt (ich erhielt einige nur gestern).
InformationsquelleAutor antongorodezkiy
Wenn Sie einfach wiederverwenden eine alte (Certificate Signing Request, CSR), stellen Sie sicher, entfernen Sie die abgelaufene/alten APNs-Zertifikat aus Ihrem Schlüsselbund exportieren, bevor Sie die neue ein und Ihre privaten Schlüssel als p12-Datei. Wenn Sie das nicht tun, wird die PEM-Datei, die Sie erzeugt aus die exportierte p12 wird noch enthalten, die abgelaufen/alte Zertifikat, das nicht gut geht mit den Apple Push-Anbieter. So entstehen
unable to connect to ssl...
.InformationsquelleAutor MkVal