2017-06-08 7 views
3

クライアント認証を使用してWebサービスに接続できるプログラム(Delphi XE5、Indy 10:TIdHTTP & TIdSSLIOHandlerSocketOpenSSL)を作成する必要があります。数日間の作業で、ついにそれが成功に終わった。 TIdSSLIOHandlerSocketOpenSSLのSSLOptions.CertFileプロパティとSSLOptions.KeyFileプロパティを設定して、認証を使用して接続できます。大丈夫だよ。 (パートナーからpfxファイルを入手しました。これをOpenSSLの証明書と秘密鍵ファイルにエクスポートしましたので、これら2つのファイルをプログラムで使用します)。KeyFileのクライアント認証を使用してWebサービスに接続するためのパスワードを設定するにはどうすればよいですか?

TButton、TMemo、およびTIdHTTPコンポーネントが1つありますフォーム。

ソースコード(ボタンのClickイベント - IdHTTP1.Request.ContentType:= '.......' 行があるため、サーバの設定の通信のためだけに必要です):

procedure TForm1.Button1Click(Sender: TObject); 
var 
    URL: string; 
    XML: TStrings; 
    S: string; 
    Req: TStream; 
    SL: TStringList; 
    SSL1 : TIdSSLIOHandlerSocketOpenSSL; 

begin 
    XML := TStringList.Create; 

    XML.Add('<soap:Envelope xmlns:ns="http://docs.oasis-open.org/ws-sx/ws-trust/200512" ' + 
    'xmlns:soap="http://www.w3.org/2003/05/soap-envelope">'); 
… 
    XML.Add(' <soap:Body>'); 
… 
    XML.Add(' </soap:Body>'); 
    XML.Add('</soap:Envelope>'); 
    URL := 'https://…………………….'; 
    end 

    Req := TStringStream.Create(XML.Text, TEncoding.UTF8); 
    try 
    SSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(nil); 
    SSL1.SSLOptions.CertFile := 'd:\certificate.pem'; 
    SSL1.SSLOptions.KeyFile := 'd:\private.pem'; 
    SSL1.SSLOptions.Mode := sslmClient; 
    try 
     SSL1.SSLOptions.Method := sslvSSLv23; 
     IdHTTP1.IOHandler := SSL1; 
     IdHTTP1.Request.ContentType := 'application/soap+xml;charset=UTF-8;action="http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/Issue"'; 
     S := IdHTTP1.Post(URL, Req); 
    finally 
     SSl1.Free; 
    end; 
    finally 
    Req.Free; 
    end; 

    ResultMemo.Lines.Add(Format('Response Code: %d', [IdHTTP1.ResponseCode])); 
    ResultMemo.Lines.Add(Format('Response Text: %s', [IdHTTP1.ResponseText])); 

    SL := TStringList.Create; 
    try 
    SL.Text := S; 
    ResultMemo.Lines.AddStrings(SL); 
    finally 
    SL.Free; 
    end; 

end; 

問題は:私のパートナーは、私が使っているファイルがパスワードで保護されていない場合、このケースは最善ではないと言いました。彼らは、OpenSSLでKeyFile用のパスワードで保護された(暗号化された)ファイルを作成する方法を教えてくれました。このパスワードで保護されたファイルをSSLOptions.KeyFileに設定すると、次のエラーメッセージが表示されます。「キーをロードできませんでした。パスワードを確認してください。エラー:0906A068:PEMルーチン:PEM_do_header:不正なパスワード読み取り "

idHTTP1.Request.Passwordプロパティでパスワードを設定しようとしましたが、結果は同じです。

質問:パスワードで保護されたキーファイルを使用する必要がある場合、どのようにしてKeyFileのパスワードを設定する必要がありますか?認証ファイルも公開する必要があるので、パスワード保護されたKeyFileを使用するのではなく、プログラムでパスワードを設定し、パスワードで保護されたKeyFileを使用するのが最善の解決策です。

ありがとうございます。

よろしく、 アッティラ

+0

https://forums.embarcadero.com/thread.jspa?threadID=110555を参照してください。 – mjn42

答えて

2

使用IdSSLIOHandlerSocketOpenSSL.OnGetPasswordイベントとはここで設定します。

procedure TForm1.IdSSLIOHandlerSocketOpenSSL1GetPassword(var Password: string); begin Password := 'thepassword'; end;

関連する問題