Как использовать SSL-сертификаты с HttpWebRequest в C #?

В настоящее время я ' m написать служебное приложение, которое будет подключаться к заданному IP-адресу и порту и проверять информацию в сертификате SSL с помощью HttpWebRequest. Когда я пытаюсь извлечь сертификат, я получаю сообщение об ошибке. Исключение, похоже, связано с тем, что копирование сертификата SSL запускает еще одну проверку.

Вот код, и, возможно, кто-то может показать мне лучший способ сделать это, или если я что-то упускаю. Меня не волнует, истек ли срок действия SSL-сертификата или он не соответствует URL-адресу. Ничего из этого не имеет отношения к тому, что я делаю.

Когда я назначаю X509Certificate в делегате новой переменной и смотрю на переменную в отладчике, все свойства показывают SSLCert.Issuer выдал исключение типа 'System.Security.Cryptography.CyrptographicException'

Когда я пытаюсь получить доступ к свойству SSLCert, я получаю следующее исключение: m_safeCertContext - недопустимый дескриптор

Я ищу это исключение, но все указывает на недействительный сертификат, который может быть истина, если срок действия сертификата истек, и может быть верным для комбинации IP и порта, к которой я подключаюсь. Но поскольку я подключаюсь к IP-адресу, используя IP-адрес, а не что-либо, что могло бы соответствовать общепринятому имени, я ожидаю этого, и мне все равно, поскольку мне все еще нужна информация.

Код ниже, я также добавил несколько комментариев что не работает и что работает.

 // To get around the SSL validation in the HttpWebRequest
        System.Net.ServicePointManager.ServerCertificateValidationCallback =
            delegate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
                        System.Security.Cryptography.X509Certificates.X509Chain chain,
                        System.Net.Security.SslPolicyErrors sslPolicyErrors)
            {
                // The below works but isn't what I want. CertName and ExpireDate are both Strings
                this.CertName = ProcessSubject(certificate.Subject);
                this.ExpireDate = certificate.GetExpirationDateString();
                // The below works but the X509Certificate SSLCert shows exceptions in the debugger for most of the properties.
                this.SSLCert = certificate;

                return true; // **** Always accept
            };
        HttpWebRequest myRequest = (HttpWebRequest)System.Net.WebRequest.Create("https://" + this.IP + ":" + this.Port + "/SSLCheck.html");
        myRequest.KeepAlive = false;
        myRequest.Method = "GET";

        try
        {
            HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
        }
        catch (Exception e)
        {
            if (e.Message != "The remote server returned an error: (404) Not Found.")
            {
                throw Exception("Error");
            }

        }

        // THE BELOW FAILS
        this.CertName = this.SSLCert.Subject;
8
задан omniplex 11 March 2011 в 16:38
поделиться