Kschuler Ответов: 2

[Решено] не удалось создать безопасный канал 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. я покопаюсь в шифрах и посмотрю, что там можно найти. Но еще раз спасибо!

2 Ответов

Рейтинг:
20

Kschuler

Мой коллега понял это. Оказывается, наши машины определили минимальную длину ключа, которая была недостаточно мала для третьей стороны, которую мы пытаемся ударить. У нас была минута 2048, и они ожидали 1024. Это можно исправить, изменив/добавив следующий параметр реестра:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\Diffie-Hellman


ClientMinKeyBitLength
Типа REG_DWORD
0x00000400


Рейтинг:
1

#realJSOP

Попробуйте запустить Visual Studio от имени администратора.


Kschuler

Попробовать это. Но это не сработало.

#realJSOP

Вы проходите через балансировщик нагрузки F5?

Kschuler

Понятия не имею о балансировщике нагрузки F5. Наезд на третью сторону.

Однако они указали, что я должен использовать TLS 1.2.

#realJSOP

Я работаю на Министерство обороны, и нам пришлось создать прокси-сервер, чтобы обойти наш балансировщик нагрузки. Мы также используем X509 и отправляем сертификат в удаленную веб-службу. Может быть, просто отправить один сертификат?

Kschuler

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

#realJSOP

Вы уверены, что используете версию CORRCET TLS?

Kschuler

Да, они подтвердили TLS 1.2.