/// <summary> /// Workaround for the bug described here /// https://bugzilla.xamarin.com/show_bug.cgi?id=6501 /// </summary> /// <param name="sender">Sender.</param> /// <param name="certificate">Certificate.</param> /// <param name="chain">Chain.</param> /// <param name="sslPolicyErrors">Ssl policy errors.</param> static bool Validator(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors) { var sslTrustManager = (IX509TrustManager)typeof(AndroidEnvironment) .GetField("sslTrustManager", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static) .GetValue(null); Func <Java.Security.Cert.CertificateFactory, System.Security.Cryptography.X509Certificates.X509Certificate, Java.Security.Cert.X509Certificate> c = (f, v) => f.GenerateCertificate( new System.IO.MemoryStream(v.GetRawCertData())) .JavaCast <Java.Security.Cert.X509Certificate> (); var cFactory = Java.Security.Cert.CertificateFactory.GetInstance(Javax.Net.Ssl.TrustManagerFactory.DefaultAlgorithm); var certs = new List <Java.Security.Cert.X509Certificate> ( chain.ChainElements.Count + 1); certs.Add(c(cFactory, certificate)); foreach (var ce in chain.ChainElements) { if (certificate.Equals(ce.Certificate)) { continue; } certificate = ce.Certificate; certs.Add(c(cFactory, certificate)); } try { //had to comment this out as sslTrustManager was returning null //working on the fix or a workaround //sslTrustManager.CheckServerTrusted (certs.ToArray (), // Javax.Net.Ssl.TrustManagerFactory.DefaultAlgorithm); return(true); } catch (Exception e) { throw new Exception("SSL error"); } }
public static bool Validator(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors) { //list of raw certs List <byte[]> rawCerts = new List <byte[]> (); rawCerts.Add(certificate.GetRawCertData()); //get rid of any duplicates in list foreach (System.Security.Cryptography.X509Certificates.X509ChainElement nextCertInChain in chain.ChainElements) { if (!certificate.Equals(nextCertInChain.Certificate)) { certificate = nextCertInChain.Certificate; rawCerts.Add(nextCertInChain.Certificate.GetRawCertData()); } } return(doSecurityCheckOnMainThread(rawCerts.ToArray())); }