Xamarin Android错误(https、ssl、tls)
我尝试在“Microsoft Visual Studio 2017”Xamarin Android应用程序中创建一个应用程序 如果我使用http而不是https(https)重复使用,它就可以正常工作 我的问题是:我怎样才能设置https呼叫 基本代码:Xamarin Android错误(https、ssl、tls),android,ssl,https,Android,Ssl,Https,我尝试在“Microsoft Visual Studio 2017”Xamarin Android应用程序中创建一个应用程序 如果我使用http而不是https(https)重复使用,它就可以正常工作 我的问题是:我怎样才能设置https呼叫 基本代码: using Android.App; using Android.Widget; using Android.OS; using Android.Support.V7.App; using System.Net.Http; using Syst
using Android.App;
using Android.Widget;
using Android.OS;
using Android.Support.V7.App;
using System.Net.Http;
using System;
using System.Text;
using System.Net;
using System.IO;
//System.Net.WebException: Error: TrustFailure (The authentication or decryption has failed.)
namespace httprequest
{
[Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
public class MainActivity : AppCompatActivity
{
private static readonly HttpClient client = new HttpClient();
Button btn1;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.activity_main);
if (Build.Brand.Equals("GENERIC", StringComparison.InvariantCultureIgnoreCase))
{
ServicePointManager.ServerCertificateValidationCallback +=
(sender, cert, chain, sslPolicyErrors) => true;
}
btn1 = FindViewById<Button>(Resource.Id.httpbtn1);
btn1.Click += delegate
{
using (var wb = new WebClient())
{
var request = (HttpWebRequest)WebRequest.Create("https://???");
request.KeepAlive = false;
request.ProtocolVersion = HttpVersion.Version10;
var response = (HttpWebResponse)request.GetResponse();
var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
Console.WriteLine(responseString);
}
};
}
}
}
使用Android.App;
使用Android.Widget;
使用Android.OS;
使用Android.Support.V7.App;
使用System.Net.Http;
使用制度;
使用系统文本;
Net系统;
使用System.IO;
//System.Net.WebException:错误:TrustFailure(身份验证或解密失败。)
命名空间httprequest
{
[活动(Label=“@string/app_name”,Theme=“@style/AppTheme”,MainLauncher=true)]
公共类MainActivity:AppCompativeActivity
{
私有静态只读HttpClient客户端=新HttpClient();
按钮btn1;
创建时受保护的覆盖无效(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
//从“主”布局资源设置视图
SetContentView(Resource.Layout.activity_main);
if(Build.Brand.Equals(“GENERIC”,StringComparison.InvariantCultureIgnoreCase))
{
ServicePointManager.ServerCertificateValidationCallback+=
(发件人、证书、链、sslPolicyErrors)=>真;
}
btn1=findviewbyd(Resource.Id.httpbtn1);
btn1.单击+=委派
{
使用(var wb=new WebClient())
{
var request=(HttpWebRequest)WebRequest.Create(“https:/?”);
request.KeepAlive=false;
request.ProtocolVersion=HttpVersion.Version10;
var response=(HttpWebResponse)request.GetResponse();
var responseString=newstreamreader(response.GetResponseStream()).ReadToEnd();
控制台。写入线(响应线);
}
};
}
}
}
以下是我得到的:
未处理的异常:System.Net.WebException:错误:TrustFailure(一个)
发生了一个或多个错误。)
在高级Adnroid属性中:
HttpClient实现:Android
SSL/TLS实现:本机TLS 1.2+
也许它仍在帮助OP或其他人在这个问题上绊倒: 我想访问我们公司的API,该API使用的证书由可信的第三方通过连接到我们黑莓服务器的三星S7(Android 8)颁发。设备本身安装了必要的证书,但我仍然收到了信任失败异常,直到我像OP所说的那样切换HTTPS实现: 右键单击Android项目->设置->Android选项->高级 将HTTPClient实现更改为Android,将SSL/TLS实现更改为本机TLS 1.2+ 然后我得到了以下错误:
java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
因此,您似乎需要将Android指向它自己的证书存储。要执行此操作,请执行以下步骤:
在资源目录中创建一个子目录xml
在内部,使用以下内容创建network_security_config.xml
<?xml version="1.0" encoding="utf-8" ?>
<network-security-config>
<base-config>
<trust-anchors>
<!-- Trust preinstalled CAs -->
<certificates src="system" />
<!-- Additionally trust user added CAs -->
<certificates src="user" />
</trust-anchors>
</base-config>
</network-security-config>
打开AndroidManifest.xml并将以下属性添加到应用程序标记
<application [...] android:networkSecurityConfig="@xml/network_security_config">
在我的情况下,它使整个事情顺利进行