我需要使用
TIdHTTP
请求 SSL 连接上 IP 地址的 HTTPS URL,因此证书验证将失败(如果对等方甚至有证书)。
curl 有
-insecure
参数,它工作得很好,但我在 TIdHTTP
中找不到任何东西来完成同样的事情。
SSESocket := TIdHTTP.Create;
SSESocket.Request.Accept := 'text/event-stream';
SSESocket.Request.CacheControl := 'no-store';
SSESocket.Get('https://'+Host+'/eventstream/clip/v2', SSEventStream);
我错过了什么?
您可以显式地将
TIdSSLIOHandlerSocketOpenSSL
组件分配给 TIdHTTP.IOHandler
属性,然后可以将 IOHandler 的 SSLOptions.VerifyMode
属性设置为 []
并将其 SSLOptions.VerifyDepth
属性设置为 0。
SSESocket := TIdHTTP.Create;
// add this ...
SSEIO := TIdSSLIOHandlerSocketOpenSSL.Create(SSESocket);
SSEIO.SSLOptions.SSLVersions := [sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2];
SSEIO.SSLOptions.Mode := sslmClient;
SSEIO.SSLOptions.VerifyMode := [];
SSEIO.SSLOptions.VerifyDepth := 0;
SSESocket.IOHandler := SSEIO;
//
SSESocket.Request.Accept := 'text/event-stream';
SSESocket.Request.CacheControl := 'no-store';
SSESocket.Get('https://'+Host+'/eventstream/clip/v2',SSEventStream);
在您的示例中,
TIdHTTP
隐式地为您创建一个具有默认设置的内部TIdSSLIOHandlerSocketOpenSSL
。
您还可以选择为
TIdSSLIOHandlerSocketOpenSSL.OnVerifyPeer
事件分配一个处理程序,并让它返回 True
以接受服务器的证书,无论 OpenSSL 通常是否会拒绝它。