2017-08-01 138 views
1

EDIT客戶端 - 由於可能misintepretation: 這不是關於HTTP服務器端/ 2 - 它的關於客戶的HTTP/2從舊服務器OS請求。此外,我得到它使用python(gobiko.apns),所以在我看來,它應該是可能的。HttpTwo 2008服務器(APNS與JWT)


EDIT 2 看來這個問題已經沒有那麼多的做HTTP2,而是由蘋果所需要的密碼。在win10之前的版本中,SLSlStream不使用TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384。然而,因爲它可以使用Python來完成,所以在我看來,它應該是可能的。任何幫助,將不勝感激。


我們在這裏和那裏發現了一些代碼,以便與我們的開發環境中的APNS進行通信。我們正在使用.p8證書並將令牌簽名爲授權(而不是「舊」接口)。

這適用於我的開發電腦(win10),但是當我將它傳輸到服務器2008 R2時,它給出了一個奇怪的警告。它似乎與tls連接的設置有關,但是,我對該區域不太熟悉。我真的搜索過,但我唯一能想出的是服務器2008R2將不支持它由於密碼或什麼(這似乎對我來說不合理)。

是從我的電腦使用的代碼(使用的NuGet HttpTwo和Newtonsoft):

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; 
     } 
    } 

從服務器2008R2扔

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

我也有WinHttpHandler,這也從我的電腦作品嚐試過,但拋出

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

蹤跡大多是異步一樣的東西,但它歸結爲HttpTwo.Http2Connection.<Connect>用於爲WinHttpHandler的HttpTwo實施和System.Net.Http.WinHttpHandler.<StartRequest>

有什麼我必須添加到服務器才能工作/我們會得到它的工作?


UPDATE 我包括來自HttpTwo的sourcefiles在我的項目和調試它。

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

在我的Win8測試電腦上。現在,當我在自己的PC上使用只有主機參數的方法重載時,它會拋出同樣的異常,我猜是因爲tls協議是關閉的。

根據這個Github issue它可能與密碼有關。我之前在這方面遇到過一些問題,但在我看來,至少WIN8 PC必須能夠達到足夠安全的密碼,對吧?

Schannel抱怨說:「從遠程端點接收到致命警報,TLS協議定義的致命警報代碼爲40」,因此指向該方向的指向也是錯誤的。

+0

據我所知,這個問題是關於HTTP/2的服務器端 - 我的問題是關於一個較舊的操作系統上運行的客戶端實現。除此之外,HTTP/2仍然是一個tcp實現,對吧?我認爲HttpTwo應該能夠運行客戶端請求?但是,thnx,所以這意味着蘋果迫使你使用'新'窗口操作系統? – user1515791

+0

我尊敬地不同意 - 這可能是脫離事後的後見之明。我真的希望這將是另一個像servicepointmanager或什麼東西設置一些屬性。我收到類似的問題,我肯定知道ServerVault的超級用戶會有什麼反應有關的那些同樣的方式... – user1515791

+0

對不起,我不能讓自己清楚你。我希望,一些成功連接到APNS的C#開發人員之前遇到(並解決了)這個問題。我的問題真的是:有什麼我可以改變/添加使我的代碼工作。 – user1515791

回答

1

它的密碼......蘋果公司使用不納入低於Win10/Server2016 SChannel中的密碼。 (見編輯2)