2017-08-01 1 views
1

EDIT - Aufgrund wahrscheinlich misintepretation: Es geht nicht um die Server-Seite von HTTP/2 - es geht um ein Client-HTTP/2-Anforderung von einem älteren Server-Betriebssystem. Auch, ich habe es mit Python (gobiko.apns) arbeiten, so scheint es mir, es sollte möglich sein.HttpTwo Client auf dem Server 2008 (APNS mit JWT)


EDIT 2 Es scheint diese Frage nicht so sehr mit HTTP2 zu tun hat, sondern die von Apple erforderlich Chiffre. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 wird von SslStream nicht in Versionen vor Win10 verwendet. Da es jedoch mit Python gemacht werden kann, scheint es mir möglich zu sein. Jede Hilfe wäre willkommen.


Wir haben hier und da einen Code gefunden, um unsere Verbindung zu den APNS zu bekommen, die an unserer Entwicklungsumgebung arbeiten. Wir verwenden das .p8-Zertifikat und signieren ein Token als Autorisierung (nicht die "alte" Schnittstelle).

Dies funktioniert auf meinem dev pc (win10), aber wenn ich es auf einen Server 2008 R2 übertrage gibt es eine seltsame Warnung. Es scheint mit dem Aufbau der Tls-Verbindung zu tun zu haben, aber ich kenne diesen Bereich nicht sehr gut. Ich habe wirklich gesucht, aber das Einzige, was ich mir vorstellen kann, ist, dass der Server 2008R2 es aufgrund von Verschlüsselungen oder etwas anderem nicht unterstützt (was mir unvernünftig erscheint).

Der Code, der von meinem PC (mit nuget HttpTwo und Newtonsoft) arbeitet: 2008R2

public static async void Send2(string jwt, string deviceToken) 
    { 
     var uri = new Uri($"https://{host}:443/3/device/{deviceToken}"); 

     ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 
     ServicePointManager.ServerCertificateValidationCallback = delegate 
     { 
      Console.WriteLine("ServerCertificateValidationCallback"); 
      return true; 
     }; 

     string payloadData = Newtonsoft.Json.JsonConvert.SerializeObject(new 
     { 
      aps = new 
      { 
       alert = new 
       { 
        title = "hi", 
        body = "works" 
       } 
      } 
     }); 

     //PayloadData always in UTF8 encoding 
     byte[] data = System.Text.Encoding.UTF8.GetBytes(payloadData); 

     var httpClient = new Http2Client(uri); 
     var headers = new NameValueCollection(); 

     headers.Add("authorization", string.Format("bearer {0}", jwt)); 
     headers.Add("apns-id", Guid.NewGuid().ToString()); 
     headers.Add("apns-expiration", "0"); 
     headers.Add("apns-priority", "10"); 
     headers.Add("apns-topic", bundleId); 

     try 
     { 
      var responseMessage = await httpClient.Send(uri, HttpMethod.Post, headers, data); 
      if (responseMessage.Status == System.Net.HttpStatusCode.OK) 
      { 
       Console.WriteLine("Send Success"); 
       return; 
      } 
      else 
      { 
       Console.WriteLine("failure {0}", responseMessage.Status); 

       return; 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("ex"); 
      Console.WriteLine(ex.ToString()); 
      return; 
     } 
    } 

wirft

System.Security.Authentication.AuthenticationException: A call to SSPI failed, see inner exception. ---> System.ComponentModel.Win32Exception: The message received was unexpected or badly formatted 

vom Server.

Ich versuchte es auch mit einem WinHttpHandler, die auch von meinem PC funktioniert, aber

System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.Http.WinHttpException: A security error occurred 

stacktraces sind meist async thingies wirft, aber es läuft darauf hinaus, HttpTwo.Http2Connection.<Connect> für die HttpTwo Umsetzung nach unten und System.Net.Http.WinHttpHandler.<StartRequest> für die WinHttpHandler.

Gibt es etwas, das ich dem Server hinzufügen muss, um zu arbeiten/werden wir es zum Funktionieren bringen?


UPDATE enthalten ich den Quell von HttpTwo in meinem Projekt und debuggt es. Die Ausnahme tritt unter

 await sslStream.AuthenticateAsClientAsync (
       ConnectionSettings.Host, 
       ConnectionSettings.Certificates ?? new X509CertificateCollection(), 
       System.Security.Authentication.SslProtocols.Tls12, 
       false).ConfigureAwait (false); 

auf meinem Win8 Test PC auf. Wenn ich nun die Methode overload nur mit dem Host-Argument auf meinem eigenen PC benutze, wird dieselbe Ausnahme ausgelöst, da das Tls-Protokoll dann deaktiviert ist.

Nach diesem Github issue könnte es mit den Ziffern zu tun haben. Ich hatte vorher einige Probleme in diesem Bereich, aber es scheint mir, dass zumindest ein WIN8-PC in der Lage sein muss, sich auf genügend sichere Verschlüsselungen zu einigen, oder?

Schannel beschwert sich über "Eine fatale Warnung wurde vom Remote-Endpunkt empfangen. Das TLS-Protokoll definierten fatalen Alert-Code ist 40.", so dass in diese Richtung auch afaik zeigt.

+0

Soweit ich sagen kann, ist diese Frage über die Server-Seite von HTTP/2 - meine Frage bezieht sich auf eine Client-Implementierung auf einem älteren Betriebssystem ausgeführt. Abgesehen davon ist HTTP/2 immer noch eine TCP-Implementierung, oder? Ich dachte, HttpTwo sollte eine Client-Anfrage ausführen können? Aber, thnx, also bedeutet es, dass Apple zwingt, "neues" Windows-Betriebssystem zu verwenden? – user1515791

+0

Ich stimme dem nicht zu - es könnte rücksichtslos sein. Ich hatte wirklich gehofft, dass es etwas anderes wäre, als etwas auf dem Servicepoint-Manager zu setzen oder so. Ich hatte vorher ähnliche Probleme und ich weiß mit Sicherheit, dass SuperUser von ServerVault auf diese Weise genauso reagieren würde ... – user1515791

+0

Es tut mir leid, dass ich Ihnen nicht klar sein konnte. Ich hatte gehofft, einige C# -Entwickler, die erfolgreich mit APNS verbunden waren, haben dieses Problem schon einmal gesehen (und behoben). Meine Frage war wirklich: Gibt es etwas, das ich ändern/hinzufügen kann, um meinen Code arbeiten zu lassen? – user1515791

Antwort

1

Es ist die Chiffre ... Die von Apple verwendeten Chiffren sind nicht in SChannel unter Win10/Server2016 enthalten. (siehe Edit 2)

Verwandte Themen