2

DelphiXE2のTIdSSLIOHandlerSocketOpenSSLIndyコンポーネントを使用して、TCP経由でSSLサーバー(Appleプッシュ通知サービス)にデータを送信しています。ある程度は機能していますが、最善の方法であるかどうかはわかりません。私は次のことをしています:

  • 株式会社SSLプロパティを設定します。証明書へのパス
  • .Openメソッドを呼び出して接続を開きます
  • 'Handshake Done'が取得されるまで、OnStatusInfoExイベントのATypeパラメーターを確認してください
  • .WriteDirectを使用してデータを送信します
  • .Closeで接続を閉じます

接続がデータを送信する準備ができたことを知るためのより良い方法はありますか?TCPを介してTIdSSLIOHandlerSocketOpenSSLコンポーネントを直接使用するサンプルコードを持っている人はいますか?私が見つけたサンプルは、主に、接続を保護するためにTIdSSLIOHandlerSocketOpenSSLコンポーネントが接続されているHTTP呼び出し用です。

4

2 に答える 2

3

クライアントコンポーネントを使用しているため、サーバーがクライアントの証明書を認証する場合にのみ、クライアントで証明書を設定する必要があります。

それ以外の場合は、TIdSSLIOHandlerSocketOpenSSLのSSLOptions.ModeをsslmClientに設定すると、接続できるようになります。

中間者攻撃を回避するために、VerifyModeを有効にし、ソケットコンポーネントでOnVerifyPeerイベントを使用して、サーバー証明書のフィンガープリントを検証することをお勧めします。

Indyのバージョンによっては、SSLOptionsメソッドをsslvTLSv1に設定する必要がある場合があります。一部のWebサーバーは、Indy9のデフォルトであるSSLv2をサポートしなくなりました。

TCPコンポーネントを使用してSSL経由でWebページを取得する方法を示すサンプルコードを次に示します。

procedure TForm1.Button1Click(Sender: TObject);
var
  s: String;
begin
  IdTCPClient1.Host := 'example.com';
  IdTCPClient1.Port := 443;
  IdTCPClient1.Connect;
  IdTCPClient1.WriteLn('GET / HTTP/1.1');
  IdTCPClient1.WriteLn('Host: example.com');
  IdTCPClient1.WriteLn('');
  // Retrieve all the data until the server closes the connection
  s := IdTCPClient1.AllData;
  Memo1.Lines.Add(s);
end;

libeay32.sllOpenSSLライブラリをssleay32.dllWindowsのEXEと同じフォルダに含めることを忘れないでください。Indy 10の標準(最新)のバイナリを使用します。

于 2012-08-07T13:03:10.687 に答える
0

これは私のために働くものです。私はDelphi2010を使用していますが、これはおそらくDelphi XE2(テストされていません)でも同様に機能します。すぐに使用できるバージョンではなく、現在のIndyのチップリビジョンであるリビジョン4774を使用します。

データモジュールまたはWebモジュールに3つのコンポーネントがあります。

  1. TIdHTTP
  2. TIdSSLIOHandlerSocketOpenSSL
  3. TidCookieManager

設計時にすべてのコンポーネントを相互に接続し、実行時に次の変更を加えます。プロトコルがプレーンhttp:の場合は、TIdSSLIOHandlerSocketOpenSSLコンポーネントを切断します。プロトコルがhttps:の場合は、IdHTTPのHandlerプロパティをIdSSLIOHandlerSocketOpenSSLに設定します。

[SSLオプション]で、メソッドをsslvSSLv23に設定し、SSLVersionsを[sslvSSLv2、sslvSSLv3、sslvTLSv1、sslvTLSv1_1、sslvTLSv1_2]に設定します。私は、これらのプロパティが機能しない他の順列を見つけました。説明できません。これがさまざまなWebサーバーで機能することを私は知っています。

そこからはとても簡単です。GETするには、TIdHTTPでGet()メソッドを呼び出すだけです。POSTの場合は、Post()を呼び出します。パラメータとCookieには、明らかに名前が付けられたプロパティからアクセスできます。

すぐに使用できるバージョンを正しくPOSTするのに多くの問題がありましたが、ヒントの改訂と、前述のようにオプションを設定することで、簡単になりました。

于 2012-08-07T14:04:37.733 に答える