Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin Android错误(https、ssl、tls)_Android_Ssl_Https - Fatal编程技术网

Xamarin Android错误(https、ssl、tls)

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

我尝试在“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 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">

在我的情况下,它使整个事情顺利进行