delphi - 如何使用 KeyFile 的客户端身份验证设置连接到 Web 服务的密码?

标签 delphi ssl passwords indy

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

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

源代码(Button 的点击事件 - 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 时,我收到以下错误消息:“无法加载 key ,请检查密码。错误:0906A068:PEM 例程:PEM_do_header:读取密码错误。”

我尝试在 idHTTP1.Request.Password 属性中设置密码,但结果是一样的。

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

非常感谢。

问候, 阿提拉

最佳答案

使用 IdSSLIOHandlerSocketOpenSSL.OnGetPassword 事件并在此处设置。

过程 TForm1.IdSSLIOHandlerSocketOpenSSL1GetPassword(var Password: string); 开始 密码 := '密码'; 结束;

关于delphi - 如何使用 KeyFile 的客户端身份验证设置连接到 Web 服务的密码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44429639/

相关文章:

ssl - 没有 Openssl 的 HTTP 公钥固定 (HPKP)

ssl - Docker 注册表登录失败并显示 "Certificate signed by unknown authority"

ruby-on-rails - 带有 tr 翻译的 SecureRandom 字符串显示大量下划线?

delphi - indy ssl delphi 服务器

delphi - 使用Pascal脚本验证字符串字符为数字(FastReport 4)

delphi - 访问子 GUI 属性标准

c# - 连接到网络共享时如何提供用户名和密码

delphi - Indy http 后解码

javascript - LetsEncrypt 覆盖不同端口

node.js - Mongoose 模型 update() 与 save()