我需要在与 IP 地址的 SSL 连接上使用 tidHTTP.Get,因此证书验证将失败(如果对等方甚至有证书)。 curl 具有“-insecure”参数,因此它工作得很好。但我在 idHTTP 上找不到任何东西来实现这一点。
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 通常是否会拒绝它。