0

Имею: платформу net core 3.1, сервер где расположен сервис: Astra linux Запрос формирую на защищённый канал https, мое приложение крутится на http.

Получаю сертификат и параллельно задаю ssl тунель (если я все верно понимаю):

 private X509Certificate2 GetSertificate (string sertPath, string sertPass, string url)
 {
   var uri = new Uri(url);
   if (uri.Scheme.Equals("https"))
   {
     ServicePointManager.ServerCertificateVAlidaetonCallback = delegate {return true;};
     ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Ssl3;

} return new X509Certificate2(sertPath, sertPass); }

Создаю HttpWebRequest:

 //где sertPath - путь по которому располагается сертификат (берем не из хранилища)
 var clientCertificate = GetSertificate (sertPath, sertPassword, "https://test.ru");
 var encoding = CodePagesEncodingProvider.Instance.GetEncoding(1251);
 HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("https://test.ru"); 
 webRequest.Method = "POST";
 webRequest.ContentType = "application/x-www-form-urlencoded";
 webRequest.Headers.Add(HttpRequestHeader.Authorization, "Basic " + Convert.ToBase64String(encoding.GetBytes(login + ":" + password)));
 webRequest.ClientCertificates.Add(clientCertificate);
 string requestData = encoding.GetBytes(" тут запрос по формату ")
 webRequest.ContentLength = requestData.Length;
 using (var sendStream = webRequest.GetRequestStream())
 {
   sendStream.Write(requestData, 0, requestData.Length);
 }
 //на строке ниже выпадает исключение: запрос пришел без клиентского сертификата
 HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();

Вопрос: что не сделала для "рукопожатия" с той стороной, почему клиент отвечает мне что мой запрос неправильный и отсутствует клиентский сертификат.

ps: переписываю приложение с net framework на net core. Старое приложение работает, запросы видят. Но приложение требуется перенести на новую платформу

Newbie
  • 1
  • Если переписываете на современный лад, то используйте современные инструменты. WebRequest является устаревшим классом в C#, он уже давно не обновлялся. Заменой ему является HttpClient, который современный и делает многое за вас (работает с сертификатами, устанавливает заголовки по типу ContentType, ну и так далее). Попробуйте, может это решит проблему. А так, лично я не могу гадать без воспроизводимого примера что не так, ибо каждый сайт уникален, по уникальным причинам кидает разные ошибки, не думаю, что кто либо даст вам нормальный ответ не видя сам сайт. – EvgeniyZ Dec 03 '22 at 12:46
  • HttpWebRequest устарел, умер и разложился (вместе с ServicePointManager). Завязывайте с некрофилией. :) Используйте современный .NET 6 или 7 и HttpClient. Наиболее вероятно, что проблема решится сама собой без костылей с сертификатами. TLS там работает из коробки без проблем. Кодировки в ответах тоже автоматически распознаются. – aepot Dec 03 '22 at 16:34
  • @EvgeniyZ закрыл, если есть еще полезные ссылки, покидайте, добавлю в шапку – aepot Dec 03 '22 at 16:44
  • Вопргс закрыт, потому что вам сначала нужно переехать на HttpClient. Материалы для ознакомления прилинковал в шапку над вопросом. Если будут проблемы с новым HTTP клиентом, задайте отдельный вопрос, а этот удалите. – aepot Dec 03 '22 at 16:48
  • Поняла. Спасибо за совет! – Newbie Dec 04 '22 at 13:43

0 Answers0