【发布时间】:2012-04-09 07:38:04
【问题描述】:
我有一个用于 HTTPS 切换到 Wininet 的爬虫。
这通常效果很好,但对于网站我会出错 ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED
示例代码:
vErrorNone := HttpSendRequest(HttpOpen_Request, nil, 0, nil, 0);
if vErrorNone = False then
begin
vErrorID := GetLastError;
if (vErrorID = ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED) then
begin
// this error
end
;
end
;
然后我尝试了一个实验:
TmpFakePointer := nil;
vErrorNone :=
InternetErrorDlg(
GetDesktopWindow()
,
HttpOpen_Request
,
ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED
,
0
or FLAGS_ERROR_UI_FILTER_FOR_ERRORS
or FLAGS_ERROR_UI_FLAGS_GENERATE_DATA
or FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS
,
TmpFakePointer
)
= ERROR_SUCCESS
;
if vErrorNone then
begin
vErrorNone := HttpSendRequest(HttpOpen_Request, nil, 0, nil, 0);
end
;
但是,这里有两件事很奇怪:
- 1) 没有显示对话框
- 2) 有效
- 2.1) 第二个 HttpSendRequest 没有错误
- 2.2) 返回有效数据
它发现上述组合非常奇怪并且与文档相反。既然用户没有选择任何证书,为什么这会起作用?如果 Wininet 在无法显示对话框时回退到匿名客户端身份验证证书(我假设我给了它不正确的句柄来显示对话框?虽然如果我明确地给它一个错误的句柄会出错)有没有办法直接选择它没有调用 InternetErrorDlg?
【问题讨论】:
标签: delphi authentication ssl certificate wininet