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

Очистка кэша SSL для WinInet в Delphi

Delphi , ОС и Железо , Windows

Иногда при работе с WinInet в Delphi возникает необходимость очистить кэш SSL. Это может быть связано с ситуациями, когда две разные WinInet-соединения используют одно и то же состояние SSL, что не позволяет исправить ошибку в пароле сертификата, например. Без очистки кэша между двумя попытками соединения первая вернёт ошибку "неверный пароль", а вторая — "Ошибка поддержки защищённого канала".

Проблема

Разработчик столкнулся с необходимостью имитации поведения кнопки "Очистить состояние SSL" в диалоговом окне "Параметры интернета" на вкладке "Содержимое" с использованием функции API в Delphi. Это необходимо для создания независимых SSL-соединений при использовании WinInet.

Решение

Исследовав поведение кнопки "Очистить состояние SSL", было обнаружено, что она выполняет два API-вызова: SslEmptyCache и IncrementUrlCacheHeaderData. Эти вызовы необходимо выполнить для очистки кэша SSL.

Пример кода

type
    TSslEmptyCache = function(pszTargetName: LPSTR; dwFlags: DWORD): BOOL; WINAPI;
    TIncrementUrlCacheHeaderData = function(nIdx: DWORD; lpdwData: LPDWORD): BOOL; WINAPI;

var
    SchannelDLLHandle, WinInetHandle: HMODULE;
    SslEmptyCache: TSslEmptyCache;
    IncrementUrlCacheHeaderData: TIncrementUrlCacheHeaderData;

begin
    SchannelDLLHandle := LoadLibrary('schannel.dll');
    WinInetHandle := LoadLibrary('wininet.dll');

    if (SchannelDLLHandle > 0) and (WinInetHandle > 0) then
    try
        SslEmptyCache := GetProcAddress(SchannelDLLHandle, 'SslEmptyCacheW');
        IncrementUrlCacheHeaderData := GetProcAddress(WinInetHandle, 'IncrementUrlCacheHeaderData');

        if Assigned(SslEmptyCache) and Assigned(IncrementUrlCacheHeaderData) then
        begin
            SslEmptyCache(nil, 0);
            var buffer: array[0] of DWORD;
            IncrementUrlCacheHeaderData(14, @buffer);
        end;
    finally
        FreeLibrary(SchannelDLLHandle);
        FreeLibrary(WinInetHandle);
    end;
end;

Этот код необходимо выполнить перед тем, как инициировать новое SSL-соединение. Обратите внимание, что функция IncrementUrlCacheHeaderData возвращает уникальный идентификатор, который сохраняется между вызовами в разных процессах.

Заключение

Использование предоставленного кода позволит разработчикам очистить кэш SSL для WinInet, что может быть необходимо для корректной работы приложений, использующих SSL-соединения в среде Delphi.

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

Необходимо очистить кэш SSL для WinInet в Delphi для создания независимых SSL-соединений.


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

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




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


:: Главная :: Windows ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 11:46:37/0.0033669471740723/0