Есть ли способ сделать что-то вроде описанного здесь: qaru.site/info/37300/..., но в приложении Xamarin.Forms PCL? Я использую HttpClient для подключения к серверу.
Игнорировать ошибки сертификата SSL в Xamarin.Forms(PCL)
Ответ 1
ServicePointManager
не определен в PCL, но определен в классах, специфичных для платформы.
Есть ServicePointManager
в Xamarin.iOS и Xamarin.Android с одинаковым использованием. Вы можете ссылаться на него внутри любых классов в ваших проектах платформы. Однако в настоящее время такого класса нет и, похоже, не подходит для приложения Windows Phone.
Пример:
// Xamarin.Android
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
{
protected override void OnCreate(Bundle bundle)
{
// You may use ServicePointManager here
ServicePointManager
.ServerCertificateValidationCallback +=
(sender, cert, chain, sslPolicyErrors) => true;
base.OnCreate(bundle);
global::Xamarin.Forms.Forms.Init(this, bundle);
LoadApplication(new App());
}
}
// Xamarin.iOS
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
{
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
ServicePointManager
.ServerCertificateValidationCallback +=
(sender, cert, chain, sslPolicyErrors) => true;
global::Xamarin.Forms.Forms.Init();
LoadApplication(new App());
return base.FinishedLaunching(app, options);
}
}
Ответ 2
Если вы используете AndroidClientHandler
, вам необходимо предоставить SSLSocketFactory
и пользовательскую реализацию HostnameVerifier
с отключенными всеми проверками. Для этого вам нужно AndroidClientHandler
подкласс AndroidClientHandler
и переопределить соответствующие методы.
internal class BypassHostnameVerifier : Java.Lang.Object, IHostnameVerifier
{
public bool Verify(string hostname, ISSLSession session)
{
return true;
}
}
internal class BypassSslValidationClientHandler : AndroidClientHandler
{
protected override SSLSocketFactory ConfigureCustomSSLSocketFactory(HttpsURLConnection connection)
{
return SSLCertificateSocketFactory.GetInsecure(1000, null);
}
protected override IHostnameVerifier GetSSLHostnameVerifier(HttpsURLConnection connection)
{
return new BypassHostnameVerifier();
}
}
А потом
var handler = new BypassSslValidationClientHandler();
var httpClient = new System.Net.Http.HttpClient(handler);
Ответ 3
Я столкнулся с этим, но с немного другим сообщением об ошибке:
Ssl error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED
at /Users/builder/jenkins/workspace/archive-mono/2019-02/android/release/external/boringssl/ssl/handshake_client.c:1132
Я исправил это с помощью OnCreate (MainActivity.cs)
:
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
// HERE
#if DEBUG
System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
#endif
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
Forms.Init(this, savedInstanceState);
// Initialize Material Design renderer
FormsMaterial.Init(this, savedInstanceState);
LoadApplication(new App());
}
Это было исправлением для Android, размещение того же кода в FinishedLaunching (AppDelegate.cs)
для iOS также должно работать.