gpt4 book ai didi

mono - 尽管 servicePointManager hack,WebRequest 无法在 Xamarin.Forms 上使用 ssl

转载 作者:行者123 更新时间:2023-12-01 23:32:33 25 4
gpt4 key购买 nike

我正在编写一个应用程序,它需要从只能通过 https 访问的 REST API 进行读取。我遇到了请求在 Mono.Security 中失败的问题,并显示消息:“身份验证或解密失败。”

我进行了研究,发现默认情况下 Mono 没有任何受信任的证书。我找到的所有资源都说我可以使用

ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback((sender, certificate, chain, policyErrors) => { return true; });

分别在 iOS 和 Droid 项目的 Main() 和 OnCreate() 方法中覆盖该检查并允许任何 ssl 证书。即使采用该解决方法,我仍然遇到相同的错误。我已经逐步检查了代码并确认在 iOS 和 Android 上运行时执行了上述行。

我的代码在访问非 https API 时完美运行。这是一个 PCL,不是共享的项目。

我在提问之前引用了这些问题/资源:

  • Ignore SSL certificate errors in Xamarin.Forms (PCL)
  • stackoverflow.com/questions/2675133/c-sharp-ignore-certificate-errors/2675183#2675183
  • bugzilla.xamarin.com/show_bug.cgi?id=6501
  • stackoverflow.com/questions/12287528/webclient-ssl-exception-with-android-4-and-mono-for-android
  • www.mono-project.com/docs/faq/security/

这是目前的代码:

public class PawPrintsDataConnection
{
private string response = "";
private Task<string> StartWebRequest(string url)
{

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.ContentType = "application/json";
request.Method = "GET";

Task<WebResponse> task = Task.Factory.FromAsync (request.BeginGetResponse, asyncResult => request.EndGetResponse (asyncResult), (object)null);
return task.ContinueWith (t => ReadStreamFromResponse (t.Result));

}
private string ReadStreamFromResponse(WebResponse response)
{
using (Stream responseStream = response.GetResponseStream ())
using (StreamReader sr = new StreamReader (responseStream)) {
string strContent = sr.ReadToEnd ();
return strContent;
}
}

public string getRawResponse(){
var task = StartWebRequest(string.Format (@"https://pawprints.rit.edu/v1/petitions?key={0}&limit={1}", "apikey", 50));

this.response = task.Result;
return response;
}
}


public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
{
protected override void OnCreate (Bundle bundle)
{
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback((sender, certificate, chain, policyErrors) => { return true; });

base.OnCreate (bundle);

global::Xamarin.Forms.Forms.Init (this, bundle);

LoadApplication (new App ());
}
}
static void Main (string[] args)
{
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback((sender, certificate, chain, policyErrors) => { return true; });
// if you want to use a different Application Delegate class from "AppDelegate"
// you can specify it here.
UIApplication.Main (args, null, "AppDelegate");
//ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

}

在我的研究中,我在 Xamarin bugzilla 上发现了一个可能相关的错误,但我不确定它是否适用于我正在使用的版本。我是 Xamarin 开发人员的新手,所以我不熟悉诸如包含哪个版本的 Mono.security 之类的事情。 https://bugzilla.xamarin.com/show_bug.cgi?id=26658

如果有帮助,这里是异常的相关部分:

System.AggregateException: One or more errors occurred ---> System.Exception: One or more errors occurred ---> System.Exception: Error: SendFailure (Error writing headers) ---> System.Exception: Error writing headers ---> System.Exception: The authentication or decryption has failed. ---> System.Exception: The authentication or decryption has failed.


at Mono.Security.Protocol.Tls.RecordProtocol.ProcessAlert (AlertLevel alertLevel, AlertDescription alertDesc) [0x00013] in ///Library/Frameworks/Xamarin.iOS.framework/Versions/8.6.1.26/src/mono/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/RecordProtocol.cs:654
at Mono.Security.Protocol.Tls.RecordProtocol.InternalReceiveRecordCallback (IAsyncResult asyncResult) [0x000dc] in ///Library/Frameworks/Xamarin.iOS.framework/Versions/8.6.1.26/src/mono/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/RecordProtocol.cs:377

最佳答案

您正在访问 pawprints.rit.edu 对吗?

然后站点的证书(及其根 CA)就可以了,即 iOS 会接受它(并且 Xamarin.iOS 将信任决定委托(delegate)给 iOS)。 IOW 设置委托(delegate)对您没有帮助(它仅用于证书,没关系)。

这里的问题是服务器是configured只允许一小部分 TLS 1.0 密码套件。它们都不与 HttpWebRequest 使用的 Mono 当前 SSL/TLS 实现兼容。

您最好的选择是使用 HttpClientCFNetworkHandler(适用于 iOS)或第 3 方句柄(例如,ModernHttpClient 适用于 iOS 和 Android)。这将使用 native (来自操作系统)的 SSL/TLS 实现,它支持那些密码套件(以及更好的性能)。

关于mono - 尽管 servicePointManager hack,WebRequest 无法在 Xamarin.Forms 上使用 ssl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28847309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com