TWebBrowser.Silent设为True仍弹出证书吊销信息提示,如何解决?
解决TWebBrowser设置Silent=True仍弹出证书吊销提示的问题
设置TWebBrowser.Silent = True仅能抑制网页脚本弹窗,而“此网站安全证书的吊销信息不可用。是否继续?”属于系统级安全提示,不受Silent属性控制。以下提供两种无需修改客户端Internet选项的编程解决方案,适合批量分发场景:
方案一:自定义证书验证策略
通过实现ICertificatePolicy接口,覆盖系统默认的证书验证逻辑,跳过吊销信息检查:
- 定义并实现自定义证书策略类
type ICertificatePolicy = interface(IUnknown) ['{79EAC9D0-BAF9-11CE-8C82-00AA004BA90B}'] function CheckPolicy(pMsg: PMsg; dwCertPolicyError: DWORD): HRESULT; stdcall; end; TCustomCertificatePolicy = class(TInterfacedObject, ICertificatePolicy) public function CheckPolicy(pMsg: PMsg; dwCertPolicyError: DWORD): HRESULT; stdcall; end; function TCustomCertificatePolicy.CheckPolicy(pMsg: PMsg; dwCertPolicyError: DWORD): HRESULT; begin // 忽略证书吊销及常见证书错误,允许继续访问 if dwCertPolicyError in [CERT_E_REVOKED, CERT_E_UNTRUSTEDROOT, CERT_E_CN_NO_MATCH, CERT_E_DATE_INVALID, SEC_E_CERT_REVOKED, SEC_E_UNTRUSTED_ROOT] then Result := S_OK else Result := E_FAIL; end;
- 在程序启动时注册该策略
var CertPolicy: ICertificatePolicy; begin CertPolicy := TCustomCertificatePolicy.Create; CoInternetSetCertificatePolicy(nil, CertPolicy); end;
方案二:直接禁用证书吊销检查
通过CoInternetSetFeatureEnabledAPI全局禁用当前进程的证书吊销检查:
procedure TForm1.Button1Click(Sender: TObject); const FEATURE_DISABLE_CERT_REVOCATION_CHECK = 21; begin CoInternetSetFeatureEnabled(FEATURE_DISABLE_CERT_REVOCATION_CHECK, SET_FEATURE_ON_PROCESS, True); WebBrowser1.Silent := True; WebBrowser1.Navigate('http://...'); end;
注意事项
- 方案一灵活性更高,可针对不同证书错误做精细化处理;方案二实现更简洁。
- 部分客户端出现提示是因为系统默认启用了严格的证书吊销检查策略,其他客户端可能已通过组策略等方式禁用。
内容的提问来源于stack exchange,提问作者Héctor C.
相关产品推荐
相关产品推荐

