Соединение SSL выходит из строя с «соединением SSL не может быть установлено», несмотря на пользовательскую проверкуC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Соединение SSL выходит из строя с «соединением SSL не может быть установлено», несмотря на пользовательскую проверку

Сообщение Anonymous »

Я сталкиваюсь с проблемой, пытаясь подключиться к сторонним API с использованием C# (.net 7), где соединение SSL не удается с ошибкой: «Соединение SSL не может быть установлено, см. Внутреннее исключение», а состояние ответа равно 0 без успешных данных. API требует сертификата клиента, и я попробовал несколько подходов к обходе проверки SSL, но ни один из них не работал. Вот подробный обзор того, что я пытался сделать:
founal
Конечная точка API основана на HTTPS и требует сертификата клиента (PKCS12 Формат с паролем). истек «Сообщение для других. < /p>
тестирование SOAPUI привело к ошибке < /p>

sslhandshakeexception: Handshake_failure < /p>
< /blockquote> Проблема с совместимостью. end. ServerCertificateCustomValidationCallback
Я настроил httpclienthandler , чтобы игнорировать ошибки SSL:

Код: Выделить всё

var handler = new HttpClientHandler();
handler.ClientCertificates.Add(new X509Certificate2("path/to/certificate.p12", "password"));
handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
using var client = new HttpClient(handler);
var response = await client.PostAsync("https://api.endpoint", new StringContent("{}", Encoding.UTF8, "application/json"));
result [/b]:

SSL -соединение не может быть установлено, см. Внутреннее исключение. /> < /blockquote>
Я также попытался настроить ServicePointManager.securityProtocol < /code> и попытался принудить старые версии TLS: < /p>

Код: Выделить всё

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls | System.Net.SecurityProtocolType.Tls11;
в сочетании с вышеуказанной настройкой httpclient , но произошла та же самая ошибка SSL.

Код: Выделить всё

var request = (HttpWebRequest)WebRequest.Create("https://api.endpoint");
request.ClientCertificates.Add(new X509Certificate2("path/to/certificate.p12", "password"));
request.Method = "POST";
request.ContentType = "application/json";
request.ServerCertificateValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;

using (var stream = request.GetRequestStream())
{
byte[] data = Encoding.UTF8.GetBytes("{}");
stream.Write(data, 0, data.Length);
}

using var response = (HttpWebResponse)request.GetResponse();
< /code>
Результат: я снова получаю ошибку подключения AME SSL.var options = new RestClientOptions("https://api.endpoint")
{
RemoteCertificateValidationCallback = (sender, cert, chain, sslPolicyErrors) => true,
ClientCertificates = new X509CertificateCollection { new X509Certificate2("path/to/certificate.p12", "password") },
MaxTimeout = 30000
};

using var client = new RestClient(options);

var request = new RestRequest { Method = Method.Post };
request.AddHeader("Content-Type", "application/json");
request.AddJsonBody(new { contractId = "" }); // Example with obscured data

var response = client.Execute(request);
< /code>
Результат: статус: 0 - 0, issuccessful: false, errormessage: < /p>

SSL -соединение не могло быть установлено, см. Внутреннее исключение. < /p>
< /blockquote>
не было связано с тем, что инициировал, но добавление в журнале исключения. />  Я также экспериментировал с ручной обработкой SSL с использованием SSLStream низкого уровня < /code>: < /p>
using var client = new TcpClient("api.endpoint", 443);
using var sslStream = new SslStream(client.GetStream(), false, (sender, cert, chain, errors) => true, null);
sslStream.AuthenticateAsClient("api.endpoint", new X509CertificateCollection { new X509Certificate2("path/to/certificate.p12", "password") }, SslProtocols.Tls12 | SslProtocols.Tls11, false);
// Send HTTP request manually
< /code>
Результат: я снова получаю аналогичную сбой соединения SSL.  < /p>
Полный код Пример: < /p>
using System;
using RestSharp;
using System.Security.Cryptography.X509Certificates;
using System.Text.Json;

class Program
{
static void Main(string[] args)
{
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls | System.Net.SecurityProtocolType.Tls11;
string certPath = "path/to/certificate.p12"; // Replace with actual path
string certPassword = "password"; // Replace with actual password
string apiUrl = "https://IP/solar-bridge-ext/ext/json-services/getContractBalance"; // Replace with actual endpoint

try
{
var certificate = new X509Certificate2(certPath, certPassword);
Console.WriteLine("Client certificate loaded successfully: " + certificate.Subject);
var options = new RestClientOptions(apiUrl)
{
RemoteCertificateValidationCallback = (sender, cert, chain, sslPolicyErrors) => { Console.WriteLine($"Errors: {sslPolicyErrors}"); return true; },
ClientCertificates = new X509CertificateCollection { certificate },
MaxTimeout = 30000
};

using var client = new RestClient(options);

var request = new RestRequest { Method = Method.Post };
request.AddHeader("Content-Type", "application/json");
request.AddJsonBody(new { contractId = "" });
Console.WriteLine("Sending request...");

var response = client.Execute(request);

Console.WriteLine($"Status: {(int)response.StatusCode} - {response.StatusCode}");
Console.WriteLine($"IsSuccessful: {response.IsSuccessful}");
Console.WriteLine($"ErrorMessage: {response.ErrorMessage}");

if (response.ErrorException != null)
{
Console.WriteLine($"Exception: {response.ErrorException.Message}");

if (response.ErrorException.InnerException != null)
Console.WriteLine($"Inner Exception: {response.ErrorException.InnerException.Message}");
}

Console.WriteLine("Response: " + (response.Content ?? "No data"));
var responseData = JsonSerializer.Deserialize(response.Content ?? "{}");

if (responseData?.Result?.ResultCode == 0)
Console.WriteLine("Data retrieved successfully.");
else
Console.WriteLine($"Error: {responseData?.Result?.ResultMessage ?? "No message"}");
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
if (ex.InnerException != null)
Console.WriteLine($"Inner Error: {ex.InnerException.Message}");
}
}

public class SampleResponse { public Result? Result { get; set; } }

public class Result
{
public int ResultCode { get; set; }
public string? ResultMessage { get; set; }
public object[]? Payload { get; set; }
}
}
note : заменить path/to/setrate.p12 , пароль, https: //api.endpoint и с фактическими значениями. Отрегулируйте класс SampleResponse , чтобы соответствовать структуре отклика API.
Дополнительные наблюдения
  • Telnet в порт сервера (443). (например, срок действия сертификата) или несоответствие протокола клиента. по умолчанию. < /li>
    Использование VPN (различные проверенные местоположения) не разрешили проблему. Body json ({}) или конкретные данные (например, {"contractId": } ) по мере необходимости.
Вопрос
Как я могу успешно подключиться к этому API, несмотря на ошибку SSL в .net 7? Есть ли способ заставить конкретную версию TLS (например, TLS 1.0) или дальше обход проверки сертификата сервера? Любые предложения для отладки или альтернативных библиотек будут оценены. /> В этом обновленном сообщении теперь включает утверждение поставщика услуг о том, что все работает на их конце, тот факт, что VPN не помог, и полный пример кода с скрытыми конфиденциальными данными. Вы можете скопировать этот текст, вставить его в переполнение стека и отправить его. Если вы получаете ответы или вам нужно обновить его с помощью новых выводов, дайте мне знать, и я помогу в их усовершенствовании!

Код: Выделить всё

HttpClient
с пользовательской проверкой сертификатов и вынужденными версиями TLS.

[*]

Код: Выделить всё

HttpWebRequest
с обходом сертификатов.

RestSharp с отключением SSL. Ошибки SSL/TLS (например, «Handshake_failure», «Неожиданный формат сообщений»).
того, что я ожидал
Успешное подключение к https (например, 200 ОК) для получения данных API Endpoints. Вместо этого я последовательно сталкивался с отказом от рукопожатия SSL, предлагая протокол/несоответствие сертификата или проблему с сервером. Не удается полностью.
Провайдер настаивает на том, что их настройка функциональна, но доказательства указывают на проблемы совместимости.>

Подробнее здесь: https://stackoverflow.com/questions/796 ... ed-despite
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»