Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Разбираемся с ошибкой 12175 при использовании WinHTTP: как предотвратить успешное SSL-рукопожатие с недействительным сертификатом

Delphi , Интернет и Сети , Сеть

В статье рассматривается проблема, связанная с использованием библиотеки WinHTTP в проектах на Delphi для осуществления защищенного взаимодействия с сервером. Проблема заключается в том, что клиент, использующий WinHTTP, успешно подтверждает TLS-рукопожатие, даже если сертификат сервера недействителен. Это происходит до того, как клиент обнаруживает ошибку сертификата и прерывает соединение, выдавая ошибку 12175. В соответствии с требованиями безопасности, соединение должно быть прервано сразу после неудачного SSL-рукопожатия, если сертификат считается недействительным.

Решение проблемы

Чтобы решить проблему, необходимо убедиться, что WinHTTP не допускает успешного рукопожатия и прерывает соединение на более раннем этапе. Для этого важно правильно настроить параметры соединения, используя соответствующие флаги.

Пример кода

userAgent := 'TestClient.exe';
hsession := WinHttpOpen(PWideChar(userAgent), WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, nil, nil, 0);
if (hsession = nil) then
  ShowMessage('Ошибка WinhttpOpen');

p := 'https';
port := 443;
requestFlags := WINHTTP_FLAG_SECURE or WINHTTP_FLAG_REFRESH_HANDLER;
server := '10.0.0.221';

hconnection := WinHttpConnect(hsession, PWideChar(server), port, INTERNET_FLAG_SECURE | INTERNET_FLAG_IGNORE_CERT_CHAIN_ERROR | INTERNET_FLAG_IGNORE_CERT_DATE_HIGHEST);
if (hconnection = nil) then
begin
  le := GetLastError;
  ShowMessage('Ошибка подключения: ' + IntToStr(le));
end;

Action := 'GET';
hInetRequest := WinHttpOpenRequest(hconnection, PWideChar(Action), nil, nil, nil, nil, requestFlags);
if (hInetRequest = nil) then
begin
  le := GetLastError;
  ShowMessage('Ошибка создания запроса: ' + IntToStr(le));
end;

WinResult := WinHttpSendRequest(hInetRequest, nil, 0, nil, 0, nil, nil);
if (not WinResult) then
begin
  le := GetLastError;
  if (le = 12175) then
    // Обработка ошибки недействительного сертификата
  else
  begin
    WinHttpCloseHandle(hInetRequest);
    ShowMessage('Ошибка выполнения запроса: ' + IntToStr(le));
  end;
end;

Важные замечания

  • При использовании INTERNET_FLAG_SECURE с функцией WinHttpConnect, необходимо установить защищенное соединение с сервером, но это не гарантирует проверку сертификата автоматически.
  • Чтобы отменить проверку цепочки сертификатов и даты сертификата, используется сочетание флагов INTERNET_FLAG_IGNORE_CERT_CHAIN_ERROR и INTERNET_FLAG_IGNORE_CERT_DATE_HIGHEST при вызове WinHttpConnect. Это необходимо, чтобы избежать нежелательного рукопожатия, но следует использовать эти флаги с осторожностью, так как они отключают механизмы безопасности.
  • Проверка факта успешного SSL-рукопожатия после недействительности сертификата невозможно в рамках функционала WinHTTP без дополнительной кастомизации. Необходимо обрабатывать ошибку 12175, как признак неудачного сертификата сразу после рукопожатия, но до завершения запроса.

Подтвержденный ответ

Текущая реализация WinHTTP не позволяет напрямую контролировать поведение SSL-рукопожатия. Однако, можно настроить соединение таким образом, чтобы соединение прерывалось сразу после обнаружения ошибки сертификата, но для этого необходимо использовать дополнительные флаги, такие как INTERNET_FLAG_IGNORE_CERT_CHAIN_ERROR и INTERNET_FLAG_IGNORE_CERT_DATE_HIGHEST, с пониманием потенциальных рисков для безопасности.

Альтернативные пути решения

В зависимости от требований безопасности, возможно, потребуется рассмотреть альтернативные библиотеки или инструменты для работы с защищенными соединениями в проектах на Delphi, которые предоставляют более гибкие настройки для проверки сертификатов.

Заключение

Важно понимать, что работа с защищенными соединениями требует тщательной настройки параметров и обработки ошибок. В случае с WinHTTP, необходимо правильно использовать флаги для настройки соединения и обрабатывать ошибки сертификатов, чтобы соответствовать требованиям безопасности.

Создано по материалам из источника по ссылке.

В статье рассматривается проблема в использовании библиотеки WinHTTP в Delphi для безопасного общения с сервером, где клиент успешно выполняет TLS-рукопожатие даже с недействительным сертификатом, что приводит к ошибке 12175 после начала передачи данных,


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Сеть ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 09:07:12/0.0035068988800049/0