簡體   English   中英

Delphi 6和Indy SSL連接不起作用

[英]Delphi 6 and Indy SSL connection not working

我需要通過SSL使用Web服務。 為了實現這一點,我在Delphi 6中構建了一個Web客戶端,該客戶端使用Indy讀取客戶端證書並通過https編寫soap請求。 該代碼的編譯版本是在IIS 5.0中運行的DLL。 在本地計算機上測試代碼后,它可以正常工作(我在代理后面)。 但是,將代碼部署到產品服務器(而非代理)后,SSL連接失敗,提示“連接SSL出錯”。

這是我的代碼:

var
  Response: TStringStream;
  IdHttp: TIdHTTP;
  IdCnxSLL: TIdConnectionInterceptOpenSSL;
  XmlSoapDoc: IXMLDocument;
begin
  Response := TStringStream.Create('');
  IdHttp := TIdHTTP.Create(nil);
  IdCnxSLL := TIdConnectionInterceptOpenSSL.Create(nil);
  XmlSoapDoc := TXMLDocument.Create(nil);
  with IdCnxSLL do
   begin
    IdCnxSLL.SSLOptions.Method := sslvSSLv23;
    IdCnxSLL.SSLOptions.RootCertFile := IniHttpConnectionData.Values['RootCertFile'];
    IdCnxSLL.SSLOptions.CertFile := IniHttpConnectionData.Values['CertFile'];
    IdCnxSLL.SSLOptions.KeyFile := IniHttpConnectionData.Values['KeyFile'];
    IdCnxSLL.OnGetPassword :=  IdConInterceptOpenSSLGetPassword;
  end;
  with IdHttp do
  begin
    if bUseProxy then
    begin
       Request.ProxyServer := IniHttpConnectionData.Values['ProxyServer'];
       Request.ProxyPort := StrToIntDef(IniHttpConnectionData.Values['ProxyPort'], 0);
    end
    else
    begin
       Host := IniHttpConnectionData.Values['HTTPHost'];
       Port := StrToIntDef(IniHttpConnectionData.Values['HTTPPort'], 443);
    end;
    Request.ContentType := 'text/xml';
    Intercept := IdCnxSLL;
    InterceptEnabled := True;
  end;

  try
    IdHttp.Post(ServiceURL, SoapEnv, Response);
  except
    on E:EIdOSSLConnectError do
       LogError('SSL Connect Error: ' + E.Message);
    on E:Exception do
      LogError('Error' + E.ClassName + ' - ' + E.Message);
  end;

我也嘗試將此代碼編譯為exe程序,並且可以正常工作。 我還需要配置/添加其他內容嗎?

謝謝。

您正在使用TIdConnectionInterceptOpenSSL的事實告訴我您正在使用非常舊的Indy版本。 我猜是D6隨附的Indy 8。 Indy 8及更早版本不再由Indy開發團隊(我是其成員)正式支持。 您確實應該升級到Indy 9,如果沒有升級到Indy 10,則在Indy 9中,TIdConnectionInterceptOpenSSL被替換為新的TIdSSLIOHandlerSocket組件。 另外,Indy 9和更早版本需要定制的OpenSSL DLL,如果您為Indy版本使用了錯誤的DLL,這也可能導致您的錯誤。 另一方面,Indy 10現在使用OpenSSL網站上的標准DLL。

最后,它奏效了。 盡管我極力鼓勵您使用Remy建議的較新版本的Indy。 我將發布對我有用的步驟,因為應該有其他人遇到相同的問題。

我發布的原始代碼是有效的,當我們需要通過安全的http(https)發布信息但遠程服務器需要使用客戶端證書進行預先身份驗證時,它可以工作。

為了使其正常工作,必須驗證以下內容:

  1. TIdHttp和TIdConnectionInterceptOpenSSL配置
  2. 證明書

對於前兩個步驟,請遵循此處提到的步驟, 鏈接文本或(如果鏈接已過期)Google“ IndySSL-使用證書身份驗證”。 它為我工作。

  1. Indy SSL DLL。 (對於來自D6 /印8下載indy_openssl096g.zip 印SSLIntelicom )這個DLL文件,其中只有這個版本印的工作的人。

希望這會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM