示例#1
0
        /// <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");
            }
        }
示例#2
0
            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()));
            }