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」,因此指向該方向的指向也是錯誤的。
據我所知,這個問題是關於HTTP/2的服務器端 - 我的問題是關於一個較舊的操作系統上運行的客戶端實現。除此之外,HTTP/2仍然是一個tcp實現,對吧?我認爲HttpTwo應該能夠運行客戶端請求?但是,thnx,所以這意味着蘋果迫使你使用'新'窗口操作系統? – user1515791
我尊敬地不同意 - 這可能是脫離事後的後見之明。我真的希望這將是另一個像servicepointmanager或什麼東西設置一些屬性。我收到類似的問題,我肯定知道ServerVault的超級用戶會有什麼反應有關的那些同樣的方式... – user1515791
對不起,我不能讓自己清楚你。我希望,一些成功連接到APNS的C#開發人員之前遇到(並解決了)這個問題。我的問題真的是:有什麼我可以改變/添加使我的代碼工作。 – user1515791