我正在创建一个Xamarin跨平台应用程序,我用.Net Standard 2.0替换了可移植类库。在这个项目中,我们正在调用托管在azure服务结构集群上的Web服务(此服务使用自签名证书托管)。我在发出连接请求时收到以下错误 -
InnerException {System.Runtime.InteropServices.COMException(0x80072F0D):找不到与此错误代码关联的文本。
证书颁发机构无效或不正确
在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在System.Net.Http.HttpHandlerToFilter.d__15.MoveNext()的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中---从抛出异常的上一个位置的堆栈跟踪结束---在System.Runtime。 System.Net.Http.DiagnosticsHandler.d__2.MoveNext()中的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中的ExceptionServices.ExceptionDispatchInfo.Throw()---从抛出异常的上一个位置开始的堆栈跟踪结束 - - System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)at System.Net.Http.HttpClientHandler.d__111.MoveNext()} System.Exception {System.Runtime .InteropServices.COMException}
我认为自签名SSL导致问题,一般为了绕过我们使用以下代码片段的证书
ServicePointManager.ServiceCertificateValidationCallback += (o, c, ch, er) => true;
它适用于针对.Net framework 4.6.1的控制台应用程序,但此代码似乎不适用于.Net Standard 2.0和.Net Core 2.0应用程序。我们是否必须做一些不同的事情才能绕过.Net Standard和.Net Core应用程序中的证书。以下是产生此错误的示例代码区域
IHubProxy _hub;
string url = @"https://www.xyz:com:8080/";
var connection = new HubConnection(url);
_hub = connection.CreateHubProxy("MyHub");
connection.Start().Wait();
您可以在主要活动/应用代表中的平台特定项目中编写此代码:
ServicePointManager.ServerCertificateValidationCallback +=
(sender, cert, chain, sslPolicyErrors) => true;
ServicePointManager在.NET Core中不可用,但您应该能够使用System.Net.Http 4.1+使用HttpClientHandler.ServerCertificateCustomValidationCallback属性设置自定义委托。
请参阅dotnet / corefx GitHub上的Add support for custom validation of server SSL Certificate to HttpClient API和System.Net.Http 4.1 Contract Revisions。