gpt4 book ai didi

windows - 如何以编程方式清除 WinInet SSL 状态(是否有 Windows API 调用)?

转载 作者:太空宇宙 更新时间:2023-11-03 13:46:19 25 4
gpt4 key购买 nike

我需要在 Delphi 中使用 API 函数模拟与“Internet 选项”对话框(“内容”选项卡)中的“清除 SSL 状态”按钮相同的行为。

我的目的是将其与 WinInet 一起使用以建立后续的独立 SSL 连接。没有这个,两个 WinInet 连接共享相同的 SSL 状态,例如,阻止我更正错误的 SSL 证书密码。

在两次连接尝试之间没有清除 SSL 状态,第一次连接返回“密码错误”,然后我更正密码并重试,但第二次尝试返回“安全通道支持错误”。

最佳答案

终于!我做到了!

我用了优秀的API Monitor , 以监视整个 Internet 选项对话框,我设法发现了“清除 SSL 状态”按钮的作用。它仅按顺序执行两个 API 调用 SslEmptyCacheIncrementUrlCacheHeaderData

API Monitor Showing the two API calls beneath the Clear SSL State Button

在发现这一点后,我能够实现以下代码,在我的请求之前执行:

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;

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);
IncrementUrlCacheHeaderData(14,@buffer);
end;
finally
FreeLibrary(SchannelDLLHandle);
FreeLibrary(WinInetHandle);
end;

当然,这是一个伪代码,但它是完整的;)

SslEmptyCache 函数在 MSDN 上有文档,但 IncrementUrlCacheHeaderData 函数没有,所以我不得不多研究一点,发现第二个参数必须是一个 PDWORD,当函数返回时,它接收一个增量数字,它是在不同进程(不同应用程序)的调用之间保持不变。

有关更多信息,您可以访问 this article我在这里解释我所有的故事。文本是葡萄牙语,但网站有一个很好的翻译工具。

感谢大家的帮助

关于windows - 如何以编程方式清除 WinInet SSL 状态(是否有 Windows API 调用)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48981599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com