Hi,
I have generated Public Key Private Key combination, and have transferred Public Key to the Server whereas I am saving Private Key on my local Machine for now, but once this procedure is done I want to check whether I as a same user is getting access to my account using the Key-based Authentication System and it fails.
1. Generating Keys:
----------------------
public SSHKeyModel GenerateKeys(SSHKeyModel objSshKeyModel)
{
//1. Setting up details.
objSshKeyModel.KeySize = 2048;
SecureShellHostKeyAlgorithm secureShellHostKeyAlgorithm = SecureShellHostKeyAlgorithm.RSA;
objSshKeyModel.PrivateKeyAlgorithm = "RSA";
string publicKeyAlgorithm = string.Empty;
switch (secureShellHostKeyAlgorithm)
{
case SecureShellHostKeyAlgorithm.RSA:
publicKeyAlgorithm = "ssh-rsa";
break;
case SecureShellHostKeyAlgorithm.DSS:
publicKeyAlgorithm = "ssh-dss";
break;
default:
throw new ApplicationException("Unsupported algorithm.");
}
objSshKeyModel.PublicKeyAlgorithm = publicKeyAlgorithm;
//1. Generating Private Key.
var _privateKey = SecureShellPrivateKey.Create(secureShellHostKeyAlgorithm, objSshKeyModel.KeySize);
objSshKeyModel._PrivateKey = _privateKey.GetPrivateKey();//byte[]
objSshKeyModel.PrivateKey = Convert.ToBase64String(objSshKeyModel._PrivateKey); //string
MemoryStream streamOutput = new MemoryStream();
_privateKey.Save(streamOutput, objSshKeyModel.Passphrase, "putty");
streamOutput.Position = 0;
objSshKeyModel.PrivateKey_ = new StreamReader(streamOutput);//StreamOutput
objSshKeyModel.PrivateKeyPhysicalLocation = @"T:\Kaushal\Component_privateKey.ppk";
_privateKey.Save(objSshKeyModel.PrivateKeyPhysicalLocation, objSshKeyModel.Passphrase, "putty"); //Location based.
SecureShellPrivateKey objSecureShellPrivateKey = new SecureShellPrivateKey(objSshKeyModel.PrivateKeyPhysicalLocation, objSshKeyModel.Passphrase);
//2. Getting Public Key.
objSshKeyModel._PublicKey = _privateKey.GetPublicKey();//byte[]
objSshKeyModel.PublicKey = objSshKeyModel.PublicKeyAlgorithm " " Convert.ToBase64String(objSshKeyModel._PublicKey) " " objSecureShellPrivateKey.Comment;//String
streamOutput = new MemoryStream();
_privateKey.SavePublicKey(streamOutput);
streamOutput.Position = 0;
objSshKeyModel.PublicKey_ = new StreamReader(streamOutput);//stream
objSshKeyModel.PublicKeyPhysicalLocation = @"T:\Kaushal\Component_publicKey.pub";
_privateKey.SavePublicKey(objSshKeyModel.PublicKeyPhysicalLocation);//Location Based.
//3. Getting Fingerprint
objSshKeyModel.Fingerprint = _privateKey.Fingerprint.ToString();
return objSshKeyModel;
}
----------------------
2. Transferring Keys : (Please do not worry about the functions used internally.)
----------------------
public bool TransferPublicKey(SSHKeyModel objSshKeyModel)
{
bool transferSuccess = false;
//1. Connect to Server.
SshClient objSshClient = new SshClient();
objSshClient.Connect(objSshKeyModel.IpAddress, objSshKeyModel.Port);
//2. Check whether server was connected.
if (objSshClient.IsConnected)
{
//2.1 Authenticating User, via username and password.
objSshClient.Authenticate(objSshKeyModel.UserName, objSshKeyModel.Password);
if (objSshClient.IsAuthenticated)
{
//User is Authenticated.
var command = string.Empty;
//1. Getting into the User Directory.
command = @"cd /home/" objSshKeyModel.UserName "";
var recievedData = ExecuteCommand(objSshClient: objSshClient, command: command, objSshKeyModel: objSshKeyModel);
//2. Setting permission to the .ssh folder.
if (string.IsNullOrEmpty(recievedData.Trim()))
{
//Command executed Successfully. chmod 700 /home/test1/.ssh
command = @"chmod 700 /home/" objSshKeyModel.UserName "/.ssh";
recievedData = ExecuteCommand(objSshClient: objSshClient, command: command, objSshKeyModel: objSshKeyModel);
if (string.IsNullOrEmpty(recievedData.Trim()))
{
//Command Executed Successfully. chmod 644 /home/test1/.ssh/authorized_keys
command = @"chmod 644 /home/" objSshKeyModel.UserName "/.ssh/authorized_keys";
recievedData = ExecuteCommand(objSshClient: objSshClient, command: command, objSshKeyModel: objSshKeyModel);
if (string.IsNullOrEmpty(recievedData.Trim()))
{
//Command Executed Successfully.
//3. Setting permission to the authorized Key file.
command = @"cd /home/" objSshKeyModel.UserName "/.ssh";
//2.2 Check whether Location-To-Be-Public-Key-Transferred exists.
recievedData = ExecuteCommand(objSshClient: objSshClient, command: command, objSshKeyModel: objSshKeyModel);
if (string.IsNullOrEmpty(recievedData.Trim()))
{
var permission = true;
if (recievedData.Contains("Permission denied"))
permission = false;
if (permission)
{
//Permission was Granted.
//#TODO: Remove this Command. Clearing the Contents of the File.
command = @"echo '' > /home/" objSshKeyModel.UserName "/.ssh/authorized_keys";
var strRecievedData = ExecuteCommand(objSshClient: objSshClient, command: command, objSshKeyModel: objSshKeyModel);
//2.2.1
strRecievedData = string.Empty;
command = @"echo '" objSshKeyModel.PublicKey "' | " "cat >> /home/" objSshKeyModel.UserName "/.ssh/authorized_keys";
strRecievedData = ExecuteCommand(objSshClient: objSshClient, command: command, objSshKeyModel: objSshKeyModel);
transferSuccess = (string.IsNullOrEmpty(recievedData.Trim()) || recievedData.Trim().Contains("''")) ? true : false;
}
else
{
//Permission was not set for the Location to be accessed.
}
}
}
}
}
}
else
{
//User is not Authenticated.
}
}
objSshClient.Disconnect();
return transferSuccess;
}
----------------------
3. Login Via Private Key:
----------------------
public bool ConnectWithKeys(SSHKeyModel objSshKeyModel)
{
var userAuthenticated = false;
try
{
//Step 1: Authenticating via SSHClient.
SshClient objSshClient = new SshClient();
objSshClient.Connect(objSshKeyModel.IpAddress, objSshKeyModel.Port);
if (objSshClient.IsConnected)
{
SecureShellPrivateKey objSecureShellPrivateKey = new SecureShellPrivateKey(objSshKeyModel.PrivateKeyPhysicalLocation, objSshKeyModel.Passphrase);// objSshKeyModel._PrivateKey);//@"D:\id_rsa.ppk"
objSshClient.Authenticate(objSshKeyModel.UserName, objSecureShellPrivateKey);
userAuthenticated = (objSshClient.IsAuthenticated) ? true : false;
}
}
catch (SecureShellException ex)
{
File.AppendAllText(@"D:\Log.txt", " Exception Occured : Stack Trace: " ex.StackTrace " ");
}
return userAuthenticated;
}
----------------------
Error at Line : objSshClient.Authenticate(objSshKeyModel.UserName, objSecureShellPrivateKey);
Error Details:
Message: A public key corresponding to the supplied private key was not accepted by the server or the user name is incorrect.
ProtocolCode: 13
ProtocolMessage: AuthenticationCancelledByUser
Source: ComponentPro.Network
Status: OperationFailed
Could you please help me identify/verify whether or not the key formats generated are correct? Also please let me know if anything placed in above code is not correct?
asked 1/24/2018 3:56:18 PM