设置身份验证类型 SFTP 连接 delphi

Setting Authentication type SFTP connection delphi

我正在使用 devart SecureBridge 通过 SFTP 创建连接,但在 SSHClient 上设置身份验证类型时遇到问题。

当我尝试不使用它时出现异常:'The negotioation of host key algorithm is failed'。我猜它正在尝试使用 private/public 密钥,但我希望它使用密码身份验证。

这是我的代码,希望有人能指导我正确的方向。

  oSSHClient    := TScSSHClient.Create(nil);
  oSFTPClient   := nil;
  oFileStorage  := nil;
  oFileStorage := TScFileStorage.Create(nil);
  oSSHClient.KeyStorage := oFileStorage;
  iColon := pos(':', edHost.text);
  oSSHClient.HostName := edHost.Text;
  if iColon > 0 then
  begin
    oSSHClient.Port := StrToIntDef(copy(edHost.Text, iColon+1, length(edHost.Text)), 22);
  end;
  oSSHClient.User := edUser.Text;
  oSSHClient.Password := edPassword.Text;

  oSSHClient.Authentication := oSSHClient.Authentication.atPassword; // How am i supposed to set this

  oSSHClient.Connect;

编辑:供其他人查看的工作代码:

  oSSHClient    := TScSSHClient.Create(nil);
  oFileStorage  := nil;
  try
    oFileStorage := TScFileStorage.Create(nil);
    oSSHClient.KeyStorage := oFileStorage;
    iColon := pos(':', edHost.text);
    oSSHClient.HostName := edHost.Text;
    if iColon > 0 then
    begin
      oSSHClient.Port := StrToIntDef(copy(edHost.Text, iColon+1, length(edHost.Text)), 22);
    end;
    oSSHClient.User := edUser.Text;
    oSSHClient.Password := edPassword.Text;
    oSSHClient.HostKeyAlgorithms.AsString:='ssh-rsa,ssh-dss';
    oSSHClient.OnServerKeyValidate := ScSSHClientServerKeyValidate;
    oSSHClient.Authentication := atPassword;
    try
      try
        oSSHClient.Connect;
        TestErrorTekst := GetLang('CaptConnectToServerOK');
      except
        TestErrorTekst := GetLang('CaptConnectToServerFailed'); 
      end;
    finally
      oSSHClient.Disconnect;
    end;
  finally
    edTest.Text := TestErrorTekst;
    oSSHClient.Free;
    oFileStorage.Free;
  end;

我想你不应该设置身份验证。

您可以尝试 2 件事。设置正确的算法

oSSHClient.HostKeyAlgorithms.AsString:='ssh-rsa,ssh-dss';

或禁用密钥验证。将 ScSSHClientServerKeyValidate 过程中的 Accept 设置为 True。

procedure TForm1.ScSSHClientServerKeyValidate(Sender: TObject;
  NewServerKey: TScKey; var Accept: Boolean);
begin
  Accept:=True;
end;