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

时间:2016-08-23 13:11:47

标签: delphi authentication sftp devart

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

当我尝试没有时,它给了我一个例外:'主机密钥算法的协商失败'。我想它试图使用私钥/公钥,但我希望它使用密码验证。

这是我的代码,我希望有人可以指导我朝正确的方向发展。

  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;

1 个答案:

答案 0 :(得分:1)

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

你可以尝试两件事。设置正确的算法

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

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

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