2017-06-16 60 views
0

我试图通过Indy TIdHTTP获得客户端SSL证书的https页面。Indy TIdHTTP获得https客户端SSL证书的页面

代码是

var IdHTTP1 : TIdHTTP; 
    IdSSLIOHandlerSocket : TIdSSLIOHandlerSocketOpenSSL; 
begin 
    try 
     IdHTTP1 := TIdHTTP.Create(self); 
     IdHTTP1.Request.BasicAuthentication := False; 
     IdHTTP1.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0'; 
     IdSSLIOHandlerSocket := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP1); 
     IdSSLIOHandlerSocket.SSLOptions.CertFile := 'cert.pem'; 
     IdSSLIOHandlerSocket.SSLOptions.Method := sslvTLSv1_2; 
     IdSSLIOHandlerSocket.SSLOptions.Mode:= sslmUnassigned; 

     IdHTTP1.IOHandler := IdSSLIOHandlerSocket; 

     writeln(IdHTTP1.Get('https://www.scriptjunkie.us/auth/verifycert')); 
    finally 
     IdSSLIOHandlerSocket.Free; 
     IdHTTP1.Free; 
    end; 

Get不验证。客户PEM证书不被接受。

如何获得与客户端证书的网址?

我已使用https://www.scriptjunkie.us/auth/verifycert网站,并获得了免费的客户端SSL认证。 FPC是3.0.2,印是10.6.2.0

+0

什么是* *实际问题? 'Get'引发异常吗?如果是这样,它说什么?为什么你首先使用客户端证书?服务器是否只响应经过身份验证的客户端?您是否可以使用标准网络浏览器访问服务器? –

+0

@Remy Lebeau是的,问题是实际的。我用最后一个Indy版本(来自dev svn)面对它。例外情况不会升高,服务器只会返回未经授权的内容。如果我使用FireFox和导入证书 - 一切正常(请参阅我的问题链接) –

+0

什么。如果'Get'没有引发错误,那么HTTP和SSL都不会失败。是什么让你认为这是一个SSL问题,而不仅仅是一个用户身份验证问题?服务器是否要求客户端通过HTTP身份验证或HTML Webform身份验证进行登录? –

回答

0

这里是工作的代码(印10.6.2.0,FPC 3.0.2)

uses IdHTTP, IdSSLOpenSSL; 

var IdHTTP1 : TIdHTTP; 
    Id_HandlerSocket : TIdSSLIOHandlerSocketOpenSSL; 
    s : string; 

begin 
    try 
     IdHTTP1 := TIdHTTP.Create(self); 
     IdHTTP1.Request.BasicAuthentication := False; 
     IdHTTP1.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0'; 
     Id_HandlerSocket := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP1); 
     cert := 'my_scriptjunkie_pem.pem'; 
     Id_HandlerSocket.SSLOptions.CertFile := cert; (* PEM contain both CERT and Key *) 
     Id_HandlerSocket.SSLOptions.KeyFile := cert; 

     Id_HandlerSocket.SSLOptions.Mode := sslmClient; 
     Id_HandlerSocket.SSLOptions.Method := sslvSSLv23; 
     IdHTTP1.IOHandler := Id_HandlerSocket; 

     WriteLn(Id_HandlerSocket.SSLOptions.CertFile); 

     s := IdHTTP1.Get('https://www.scriptjunkie.us/auth/verifycert'); 

     writeln(s); 

    finally 
     Id_HandlerSocket.Free; 
     IdHTTP1.Free; 
    end;  
end;