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"));
SSL -соединение не может быть установлено, см. Внутреннее исключение. /> < /blockquote>
Я также попытался настроить ServicePointManager.securityProtocol < /code> и попытался принудить старые версии TLS: < /p>
Код: Выделить всё
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls | System.Net.SecurityProtocolType.Tls11;
Код: Выделить всё
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; }
}
}
Дополнительные наблюдения
- Telnet в порт сервера (443). (например, срок действия сертификата) или несоответствие протокола клиента. по умолчанию. < /li>
Использование VPN (различные проверенные местоположения) не разрешили проблему. Body json ({}) или конкретные данные (например, {"contractId": } ) по мере необходимости.
Как я могу успешно подключиться к этому API, несмотря на ошибку SSL в .net 7? Есть ли способ заставить конкретную версию TLS (например, TLS 1.0) или дальше обход проверки сертификата сервера? Любые предложения для отладки или альтернативных библиотек будут оценены. /> В этом обновленном сообщении теперь включает утверждение поставщика услуг о том, что все работает на их конце, тот факт, что VPN не помог, и полный пример кода с скрытыми конфиденциальными данными. Вы можете скопировать этот текст, вставить его в переполнение стека и отправить его. Если вы получаете ответы или вам нужно обновить его с помощью новых выводов, дайте мне знать, и я помогу в их усовершенствовании!
Код: Выделить всё
HttpClient
[*]
Код: Выделить всё
HttpWebRequest
RestSharp с отключением SSL. Ошибки SSL/TLS (например, «Handshake_failure», «Неожиданный формат сообщений»).
того, что я ожидал
Успешное подключение к https (например, 200 ОК) для получения данных API Endpoints. Вместо этого я последовательно сталкивался с отказом от рукопожатия SSL, предлагая протокол/несоответствие сертификата или проблему с сервером. Не удается полностью.
Провайдер настаивает на том, что их настройка функциональна, но доказательства указывают на проблемы совместимости.>
Подробнее здесь: https://stackoverflow.com/questions/796 ... ed-despite