2017-06-16 57 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;