1

SSL 経由で Web サービスを利用する必要があります。これを達成するために、Indy を使用してクライアント証明書を読み取り、https 経由で SOAP リクエストを書き込む Web クライアントを Delphi 6 で構築しました。コードのコンパイル済みバージョンは、IIS 5.0 で実行される DLL です。ローカル マシンでコードをテストした後、問題なく動作します (プロキシの背後にいます)。しかし、コードが prod サーバー (プロキシではない) にデプロイされた後、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プログラムにコンパイルしてみましたが、動作します。他に設定/追加する必要があるものはありますか?

ありがとう。

4

2 に答える 2

3

TIdConnectionInterceptOpenSSLを使用しているという事実は、非常に古いバージョンのIndyを使用していることを示しています。D6に同梱されていたIndy8を推測しています。Indy 8以前は、(私がメンバーである)Indy開発チームによって正式にサポートされなくなりました。Indy 10ではなく、Indy9にアップグレードする必要があります。Indy9では、TIdConnectionInterceptOpenSSLが新しいTIdSSLIOHandlerSocketコンポーネントに置き換えられました。また、Indy9以前ではカスタムメイドのOpenSSLDLLが必要でした。これは、バージョンのIndyに間違ったDLLを使用している場合にも、エラーの原因となる可能性があります。一方、Indy 10は、現在OpenSSLのWebサイトにある標準のDLLを使用しています。

于 2009-09-15T23:33:58.137 に答える
2

最後にそれは働いた。ただし、Remy が提案するように、新しいバージョンの Indy を使用することを強くお勧めします。同じ問題を抱えている人が他にもいるはずなので、私のためにトリックを行った手順を投稿します。

私が投稿した元のコードは機能します。セキュリティで保護された http (https) を介して情報を投稿する必要がある場合に機能しますが、リモート サーバーではクライアント証明書を使用した事前認証が必要です。

動作させるには、次のことを確認する必要があります。

  1. TIdHttp および TIdConnectionInterceptOpenSSL 構成
  2. 証明書

最初の 2 つの手順については、こちらのリンク テキストまたは (リンクの有効期限が切れている場合) Google の「IndySSL - 証明書認証の使用」に記載されている手順に従います。それは私のために働いた。

  1. Indy SSL DLL。(D6/Indy 8の場合、 Indy SSLまたはIntelicomから indy_openssl096g.zip をダウンロードします) この DLL は、このバージョンの Indy で機能する唯一のものです。

これが役立つことを願っています。

于 2009-09-17T09:10:37.343 に答える