如何使用TIdHTTP发起不安全的SSL请求?
解决TIdHTTP访问基于IP的HTTPS URL时证书验证失败的问题
当你用IP地址访问HTTPS URL时,证书验证失败的核心原因是HTTPS证书默认绑定域名,证书的主题名称(Subject)或SAN扩展中并未包含你使用的IP地址,因此Indy的SSL验证逻辑会判定证书无效——这和curl遇到的场景完全一致。
要实现类似curl -insecure的跳过证书验证功能,你需要给TIdHTTP配置专用的SSL处理器并关闭证书验证逻辑,具体修改如下:
首先确保你的项目已引用Indy的OpenSSL相关单元:IdSSLOpenSSL、IdSSLIOHandlerSocketOpenSSL
然后调整你的代码:
var SSESocket: TIdHTTP; SSLHandler: TIdSSLIOHandlerSocketOpenSSL; begin SSESocket := TIdHTTP.Create; try // 创建并配置SSL处理器 SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(SSESocket); // 关闭证书验证,对应curl的-insecure参数 SSLHandler.SSLOptions.VerifyMode := []; SSLHandler.SSLOptions.VerifyDepth := 0; // 将SSL处理器绑定到TIdHTTP SSESocket.IOHandler := SSLHandler; SSESocket.Request.Accept := 'text/event-stream'; SSESocket.Request.CacheControl := 'no-store'; SSESocket.Get('https://'+Host+'/eventstream/clip/v2', SSEventStream); finally SSESocket.Free; end; end;
关键配置说明:
SSLHandler.SSLOptions.VerifyMode := []:清空验证模式集合,关闭所有证书有效性检查SSLHandler.SSLOptions.VerifyDepth := 0:设置证书链验证深度为0,彻底跳过证书链的层级验证
修改后,TIdHTTP就会忽略证书与IP不匹配的问题,成功建立SSL连接。
内容的提问来源于stack exchange,提问作者Wolfgang Bures
相关产品推荐
相关产品推荐

