Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何为KeyFile设置通过客户端身份验证连接到web服务的密码?_Delphi_Ssl_Passwords_Indy - Fatal编程技术网

Delphi 如何为KeyFile设置通过客户端身份验证连接到web服务的密码?

Delphi 如何为KeyFile设置通过客户端身份验证连接到web服务的密码?,delphi,ssl,passwords,indy,Delphi,Ssl,Passwords,Indy,我必须编写一个程序(delphixe5,indy10:TIdHTTP&TIdSSLIOHandlerSocketOpenSSL),它可以通过客户端身份验证连接到web服务。经过几天的努力,终于成功了。我可以使用身份验证进行连接,设置TIdSSLIOHandlerSocketOpenSSL的SSLOptions.CertFile和SSLOptions.KeyFile属性。很好。(我从我的合作伙伴那里得到了一个pfx文件,我用OpenSSL将它导出到一个证书和一个私钥文件,所以我在程序中使用了这两个

我必须编写一个程序(delphixe5,indy10:TIdHTTP&TIdSSLIOHandlerSocketOpenSSL),它可以通过客户端身份验证连接到web服务。经过几天的努力,终于成功了。我可以使用身份验证进行连接,设置TIdSSLIOHandlerSocketOpenSSL的SSLOptions.CertFile和SSLOptions.KeyFile属性。很好。(我从我的合作伙伴那里得到了一个pfx文件,我用OpenSSL将它导出到一个证书和一个私钥文件,所以我在程序中使用了这两个文件。)

我在表单上有一个TButton、TMemo和TIdHTTP组件

源代码(按钮的单击事件-IdHTTP1.Request.ContentType:='…..行仅用于通信,因为服务器设置):

procedure TForm1.按钮1点击(发送方:TObject);
变量
URL:string;
XML:TStrings;
S:字符串;
请求:TStream;
SL:TStringList;
SSL1:TIdSSLIOHandlerSocketOpenSSL;
开始
XML:=TStringList.Create;
XML.Add(“”);
…
XML.Add(“”);
…
XML.Add(“”);
XML.Add(“”);
URL:=“https://…….”;
结束
Req:=TStringStream.Create(XML.Text,TEncoding.UTF8);
尝试
SSL1:=TIdSSLIOHandlerSocketOpenSSL.Create(nil);
SSL1.SSLOptions.CertFile:=“d:\certificate.pem”;
SSL1.SSLOptions.KeyFile:=“d:\private.pem”;
SSL1.SSLOptions.Mode:=sslmClient;
尝试
SSL1.SSLOptions.Method:=SSLV23;
IdHTTP1.IOHandler:=SSL1;
IdHTTP1.Request.ContentType:=“应用程序/soap+xml;字符集=UTF-8;行动=”http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/Issue"';
S:=IdHTTP1.Post(URL,Req);
最后
SSl1.免费;
结束;
最后
要求免费;
结束;
ResultMemo.Lines.Add(格式('Response Code:%d',[IdHTTP1.ResponseCode]);
ResultMemo.Lines.Add(格式('Response Text:%s',[IdHTTP1.ResponseText]);
SL:=TStringList.Create;
尝试
SL.文本:=S;
ResultMemo.Lines.AddStrings(SL);
最后
SL.免费;
结束;
结束;
问题是:我的搭档说,如果我使用的文件没有密码保护,这个案例就不是最好的。他们告诉我如何使用OpenSSL为密钥文件创建密码保护(加密)文件。当我将此密码保护文件设置为SSLOptions.KeyFile时,我收到以下错误消息:“无法加载密钥,请检查密码。”。错误:0906A068:PEM例程:PEM_do_头:错误的密码读取。“

我试图在idHTTP1.Request.password属性中设置密码,但结果相同

问题:如果我必须使用受密码保护的密钥文件,我必须如何以及在何处设置密钥文件的密码?因为我也必须发布认证文件,所以最好的解决方案是在程序中设置密码并使用受密码保护的密钥文件,而不是不使用受密码保护的密钥文件

非常感谢

问候,,
Attila

使用idsslohandlersocketopenssl.OnGetPassword事件并在此处设置它

过程TForm1.idsslohandlersocketopenssl1getpassword(变量密码:字符串);
开始
密码:='密码';
结束

请参见
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;