Хорошо
Вы можете сделать две вещи:
1: показать ошибку сертификата пользователю и позволить ему принять решение или не продолжать.
2: Игнорировать любые ошибки сертификата, которые вы получаете.
Я покажу вам, как сделать второй вариант:
Когда вы получаете ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED
или любую другую ошибку сертификата, вам нужно позвонить InternetSetOptions
, чтобы сообщить wininet, что он должен игнорировать ошибку и продолжить. После этого вам необходимо повторно отправить запрос.
function SetToIgnoreCerticateErrors(var aErrorMsg: string): Boolean;
var
vDWFlags: DWord;
vDWFlagsLen: DWord;
begin
Result := False;
try
vDWFlagsLen := SizeOf(vDWFlags);
if not InternetQueryOptionA(oRequestHandle, INTERNET_OPTION_SECURITY_FLAGS, @vDWFlags, vDWFlagsLen) then begin
aErrorMsg := 'Internal error in SetToIgnoreCerticateErrors when trying to get wininet flags.' + GetWininetError;
Exit;
end;
vDWFlags := vDWFlags or SECURITY_FLAG_IGNORE_UNKNOWN_CA or SECURITY_FLAG_IGNORE_CERT_DATE_INVALID or SECURITY_FLAG_IGNORE_CERT_CN_INVALID or SECURITY_FLAG_IGNORE_REVOCATION;
if not InternetSetOptionA(oRequestHandle, INTERNET_OPTION_SECURITY_FLAGS, @vDWFlags, vDWFlagsLen) then begin
aErrorMsg := 'Internal error in SetToIgnoreCerticateErrors when trying to set wininet INTERNET_OPTION_SECURITY_FLAGS flag .' + GetWininetError;
Exit;
end;
Result := True;
except
on E: Exception do begin
aErrorMsg := 'Unknown error in SetToIgnoreCerticateErrors.' + E.Message;
end;
end;
end;
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
//call SetToIgnoreCerticateErrors
//re-send the request
end
end
end;
Я извлек SetToIgnoreCerticateErrors
из моего Wininet API, и он может не скомпилировать точно, как это.
Это шаги:
1 - получить ошибку
2 - Проверьте, является ли ошибка сертификатом ошибки
3 - Если это ошибка сертификата, они вызывают InternetSetOption, как я.
4 - повторно отправить запрос.
Я не знаю, как реализовать первый параметр «Показать ошибку сертификата пользователю и позволить ему решить, продолжать или нет». потому что мне никогда не приходилось это делать.
Кроме того, проверьте это: Как обработать неверную ошибку центра сертификации с WinInet
Надеюсь, это вам поможет.