[Решено] не удалось создать безопасный канал SSL/TLS
У меня есть проект .Net 4.5 web api, который должен отправить HttpWebRequest с сертификатом. Я могу заставить все работать в почтальоне (Среда разработки Postman | API[^]), но не могу заставить свой код работать. Я постоянно получаю эту ошибку: System.Net.WebException: "запрос был прерван: не удалось создать безопасный канал SSL/TLS".
Я подтвердил, что мой сертификат верен, и я могу видеть в отладке, что он загружается в объект запроса правильно. Я даже пробовал загружать его как из pfx-файла, так и из магазина.
Когда вы гуглите, есть много результатов. Большинство из них, по-видимому, исправляются путем указания
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
или его версия, использующая символы каналов для включения всех протоколов. Это сработало для других, потому что .Net 4.5 по умолчанию не использует TLS 1.2, так что это вручную вынуждает его использовать. Так что я почти уверен, что мне это нужно, но это не исправило ошибку для меня. :(
Также погуглил и нашел этот документ, Настройки TLS-SSL | Microsoft Docs[^], который говорит об изменении настроек в реестре, чтобы включить Tls 1.2. я также пробовал это, и это не исправило его.
Я в полном недоумении. У кого-нибудь есть другие идеи? Если не о том, как ее решить, даже чтобы получить больше информации о том, почему она терпит неудачу?
Любая помощь будет оценена по достоинству.
//Convert object to json string json = JsonConvert.SerializeObject(objCustomObject); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; ServicePointManager.Expect100Continue = true; ServicePointManager.DefaultConnectionLimit = 9999; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestPath); // path starts with https:// request.Method = "POST"; request.ContentType = "application/json"; //Get certificate X509Store store = new X509Store(StoreName.My,StoreLocation.LocalMachine); store.Open(OpenFlags.ReadOnly); X509Certificate2Collection collection = store.Certificates.Find(X509FindType.FindBySubjectName, "mycertsubjectname",false); //Associate the collection of certificates to the request request.ClientCertificates = collection; //Add headers request.Headers.Add("CUSTOM-HEADER-1", "headerValue1"); request.Headers.Add("CUSTOM-UNIX-EPOCH-TIMESTAMP-HEADER", "1557515741"); // unixEpochTimestamp); request.Headers.Add("CUSTOM-HEADER-3", "headerValue3"); //write to request StreamWriter writer = new StreamWriter(request.GetRequestStream()); writer.Write(json); writer.Close(); //get response HttpWebResponse response = (HttpWebResponse)request.GetResponse(); // ERROR: ' The request was aborted: Could not create SSL/TLS secure channel.'
Что я уже пробовал:
Попробовал добавить это и некоторые другие вещи менеджера точек обслуживания.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Попробовал изменить настройки реестра в соответствии с инструкциями от Настройки TLS-SSL | Microsoft Docs[^].
Пробовал разные техники добавления сертификата.
Коллега попытался преобразовать наш проект .Net 4.5 в проект .Net 4.6...не получилось.
Работает против, как админ.
Попробовал добавить разрешения к сертификату в диспетчере сертификатов.
Richard Deeming
Вам необходимо выяснить, какие версии TLS поддерживаются сервером, и убедиться, что эти протоколы включены для клиентских запросов на вашем компьютере.
Также может быть неправильное совпадение между включенными шифрами на клиенте и сервере.
Если предположить, что это публичный сайт, то Тест Qualys SSL[^] даст вам много подробностей о том, что включено на сервере.
Kschuler
Чувак. Спасибо, что указали на этот инструмент. Потрясающий. К сожалению, это только подтверждает, что я ищу TLS 1.2. я покопаюсь в шифрах и посмотрю, что там можно найти. Но еще раз спасибо!