我有一个爬虫,HTTPs切换到Wininet。Wininet SSL客户端验证奇怪
这通常效果很好,但对于一个网站,我得到错误 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?
谢谢,我会试试看!:)我仍然发现我的解决方案很奇怪,因为它与文档相反。我会切换到你的:) – Tom 2012-04-05 11:49:15
刚刚测试过的解决方案,它的工作原理!谢谢:) – Tom 2012-04-05 12:21:22
我很高兴我可以帮助你。 – 2012-04-05 12:28:29