Работа с SSL-сертификатами с.Net Framework

Я пытаюсь сделать GET-запрос к сервису распознавания речи Яндекса - чтобы поток распознал:

GET /asr_partial HTTP/1.1\r\n
User-Agent:Ross' Third apartmentAliveClient\r\n
Host: voice-stream.voicetech.yandex.net:80\r\n
Upgrade: dictation\r\n\r\n

Итак, я пишу простой код для этого:

public string HttpGet(String serviceUri, String host, String userAgent, String upgradeValue)
    {
     req = WebRequest.Create(serviceUri)
                    as HttpWebRequest;

        req.ClientCertificates.Add(_certificat);

        req.Host = host;
        req.UserAgent = userAgent;
        req.Date = DateTime.Now;
        Console.WriteLine(req.ToString());
        req.Headers["Upgrade"] = upgradeValue;
        string result = null;
        using (HttpWebResponse resp = req.GetResponse()
                                      as HttpWebResponse)
        {
            StreamReader reader =
                new StreamReader(resp.GetResponseStream());
            result = reader.ReadToEnd();
        }
        return result;
    }

Но когда я вызываю метод - лови исключение:

System.Net.WebException: базовое соединение было закрыто: не удалось установить доверительные отношения для безопасного канала SSL/TLS.

Хорошо, я думаю, что эта проблема заключается в том, что я должен импортировать сертификат CA ( сайт Яндекса на мою машину). Итак, я пытаюсь сделать это - найти какой-то CA -но -Certum,Certum Level 4 CA, но, насколько я понимаю, это так теперь то, что мне нужно.

Хорошо, я пишу этот код, чтобы получить сертификат и сохранить его в файл:

 ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(customXertificateValidation);

private bool customXertificateValidation(object sender, X509Certificate cert, X509Chain chain, System.Net.Security.SslPolicyErrors error)
    {
        if (cert.Subject == "CN=*.asr.yandex.net, O=YANDEX, OU=ITO, L=Moscow, S=Russia, C=RU")
        {
            var certBytes= cert.Export(X509ContentType.Cert);
            File.WriteAllBytes("yandexCA.txt", certBytes);
            return true;
        }
        return false;
    }

Затем я изменил метод, импортировал сертификат и добавил его в запрос:

 public string HttpGet(String serviceUri, String host, String userAgent, String upgradeValue)
    {          
        _certificat = new X509Certificate2();

        var certBytes = File.ReadAllBytes("yandexCA.txt");            
        _certificat.Import(certBytes);           

        HttpWebRequest req = WebRequest.Create(serviceUri)
                    as HttpWebRequest;

        req.ClientCertificates.Add(_certificat);

        req.Host = host;
        req.UserAgent = userAgent;
        req.Date = DateTime.Now;
        Console.WriteLine(req.ToString());
        req.Headers["Upgrade"] = upgradeValue;
        string result = null;
        using (HttpWebResponse resp = req.GetResponse()
                                      as HttpWebResponse)
        {
            StreamReader reader =
                new StreamReader(resp.GetResponseStream());
            result = reader.ReadToEnd();
        }
        return result;
    }
}

Сертификат Тема:

Subject = "CN=*.asr.yandex.net, O=YANDEX, OU=ITO, L=Moscow, S=Russia, C=RU"

Но ошибка такая же:

System.Net.WebException: базовое соединение было закрыто: не удалось установить доверительные отношения для безопасного канала SSL/TLS.

Что я должен сделать, чтобы исправить эту ошибку?
Нужно ли устанавливать этот сертификат на мою машину? Если да - Как это сделать?- Я получил только массив байтов.

PS При коде я использую callback:

 ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(customXertificateValidation);

Итак, ответ:

Произошло необработанное исключение типа "System.Net.WebException" в System.dll
Дополнительная информация: отправка сообщения с удаленного сервера: (501) не поддерживается.

0 ответов

Другие вопросы по тегам