服务器 2008 上的 HttpTwo 客户端(带有 JWT 的 APNS)



EDIT - 由于可能的误解:这与HTTP/2的服务器端无关 - 而是关于来自旧服务器操作系统的客户端HTTP/2请求。另外,我让它使用python(gobiko.apns(工作,所以在我看来应该是可能的。


编辑 2这个问题似乎与HTTP2没有太大关系,而是苹果所需的密码。TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 在 win10 之前的版本中不被 SslStream 使用。但是,由于可以使用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;
}
}

正在投掷

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

从服务器 2008R2。

我也用WinHttpHandler试过了,它也可以在我的电脑上工作,但扔掉了

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

堆栈跟踪大多是异步的,但它归结为HttpTwo实现的HttpTwo.Http2Connection.<Connect>和WinHttpHandler的System.Net.Http.WinHttpHandler.<StartRequest>

我必须向服务器添加一些东西才能工作/我们会让它工作吗?


更新我将 HttpTwo 中的源文件包含在我的项目中并对其进行了调试。异常发生在

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

在我的 Win8 测试电脑上。现在,当我在自己的 PC 上使用仅带有主机参数的方法重载时,它会抛出相同的异常,我想是因为 tls 协议当时已关闭。

根据这个Github问题,它可能与密码有关。我之前在这方面遇到了一些问题,但在我看来,至少 WIN8 PC 必须能够就足够安全的密码达成一致,对吧?

Schannel 抱怨"从远程终结点收到致命警报。TLS 协议定义的致命警报代码是 40.",因此这也指向该方向。

这是密码...Apple 使用的密码不包含在 Win10/Server2016 下面的 SChannel 中。 (见编辑2(

相关内容

  • 没有找到相关文章

最新更新