Technology in terms you understand. Sign up for the Confident Computing newsletter for weekly solutions to make your life easier. Click here and get The Ask Leo! Guide to Staying Safe on the Internet — FREE Edition as my thank you for subscribing!

How Do I Create and Use Public Keys with SSH?

SSH (Secure Shell) and SFTP (Secure FTP) support a very strong security model that can be used instead of the normal username and password authentication scheme we’ve all come to know and love. It uses public key cryptography to create a different, and more secure approach to authenticating your identity and rights to access a server or resource.

In a nutshell, you will generate a public and private key pair. The public key will be placed on the server by your system administrator, giving you access. You will keep the file containing the private key in a safe place. You’ll login by simply by providing that private key file to your SSH or SFTP supporting client.

It really is that simple.

Become a Patron of Ask Leo! and go ad-free!

The private key is just that – private. You may put a password on it, but you don’t have to. Without a password, all you need is the file in order to login. Or, to put it more clearly, all anyone needs is that file to login as you. Obviously if you password protect the file, then you’ll need both the file, and the password to unlock it. In that case, logging in is very similar to what you do today: specify a user name, and a password to unlock your key file.

Instructions are included here for the following tools, which are known to work with this technique:

SSH Clients SFTP Clients
PuTTY
SecureCRT
PSFTP


WS_FTP

Instructions for these tools are not provided here, but they either claim or have been confirmed to have the appropriate support:

SSH Clients SFTP Clients
Tera Term Pro CuteFTP Professional (not Home)WinSCP

Other tools may also work. The key terminology to look for is “SSH” or “SFTP” and “Public Key Authentication”.

Generating Your Keys

In general it’s best to create your own key. That way you control what happens to your private key, and no one else ever has to see it.

PuTTYgen

PuTTY is a free SSH client that includes a tool for generating keys, called PuTTYgen. The tool can also be downloaded separately, but why bother … get the whole thing. PuTTY is my recommended SSH client.

When you run PuTTYgen, you’ll get a dialog with a “Generate” button on it.
PuTTYgen Window
Push the button.

It will ask you to move the mouse around to generate randomness. (Randomness is a key component of public key cryptography). Once that’s happened enough, you should do the following:

  • Specify a passphrase. Technically this is optional, but if you omit the passphrase, then anyone who happens to get ahold of your private key file can login as you. You may have enough security in place where this is not an issue.  If you do specify a passphrase, you’ll need to enter it when you login, pretty much as a normal login.
  • Press the Save Public Key button to save the public key. I recommend saving as your name “.pub”. For example I would save “leo.pub”.
  • Press the Save Private Key button to save your private key. This saves the private key in PuTTY’s own format, a “.ppk” file. So, “name.ppk” might be appropriate.
  • I also recommend hitting the Conversions menu, and then Export Openssh key, and saving that to “name.key”. This format will allow you to use your private key with other applications besides PuTTY.

SecureCRT

SecureCRT is a stand-alone SSH client.

To create a public key with SecureCRT, hit the Tools menu, Create Public Key… option to begin the wizard.

Select RSA as the key type. Enter (or not) an appropriate passphrase to protect your private key. A default key length of 1024 is sufficient. Allow SecureCRT to save the key, noting the location thereof. It may ask if you want to use this as your global Public Key, and you can safely say “yes”.

WS_FTP

As far as I can tell, WS_FTP cannot import key pairs for use, or will it export its private key. This means that even if you use one of the other SSH clients and generate key pairs for their use, you’ll still need generate a separate key pair for use within WS_FTP. That’s not a problem from the servers perspective – you can authenticate with as many different keys as you like.

In WS_FTP, hit Tools, Options, and then click on SSH, Client Keys:
WS_FTP Options Dialog
Press Create, and step through the wizard. The key type should be RSA, and the default size of 1024 is sufficient.

Once the key has been created and shows up in the list, click on it, and then click on Export, to export your public key. Send the resulting .pub file to your system administrator.

Once you have your keys…

Send your public key to your system administrator. (Either the “.pub” file as an attachment, or the text within it, in email.) It will be put in “all the right places” to allow you to log in to all the account(s) you might need to.

Keep your private key in a safe place. You’ll need it each time you want to login. If they are lost, you will lose access until the key generation and installation process can be repeated. If they or the computer they’re on are stolen, tell your system admin immediately.

Using Your Keys – SSH

Once your keys are generated, and the public key installed on the server, you’ll need to specify the private key to your SSH client in order to log in.

PuTTY

There are (at least) two approaches to using Public/Private keys with PuTTY. When you fire up PuTTY without any arguments, you get its standard configuration dialog, into which you can enter the name of the server you want to connect to:
Putty main window
On the left hand side is a tree view of various options. Underneath Connection, SSH, click on Auth and the dialog will include a field “Private key file for authentication“:
Putty SSH connection options window
Specify the location of the “.ppk” file that you generated with PuTTYgen. When you connect, if your private key is passphrase protected, you’ll be asked for the passphrase.

The other approach, and the one that I use, is to simply create shortcuts for the various servers I connect to regularly, and specify the location of the private key on the command line. For example:

C:pathPUTTY.EXE -i c:otherpathleo.ppk
leo@server.com

That, as a desktop shortcut, or item on a Windows menu, connects to the named server using the specified account name “leo”, and uses the private key found in “c:otherpathleo.ppk” to authenticate.

SecureCRT

SecureCRT has several paths to a connection dialog, but we’ll use “Quick Connect” for our example. Press the Quick Connect Icon, and you should get something like this:
SecureCRT Quick Connect Dialog
Make sure that protocol is set to SSH2, and enter your host and username. In Authentication, UNcheck everything
except PublicKey. Then click on that, and click Properties. You should see this:
SecureCRT Public Key Properties Dialog
Typically you need do nothing, but this dialog specifies the location of your identity file (aka Private Key).

Assuming that your public key has been placed on the server for your account, you should now be able to connect.

Using Your Keys – SFTP

Secure FTP, or FTP, is really just using SSH technology to provide FTP-like functionality. Since it’s using SSH, the keys you’ve generated and are using for your SSH authentication work with many SFTP applications as well.

WebDrive

is an FTP/SFTP service for Windows that allows you to treat an FTP or SFTP connection like another drive mounted on your system. Uploading and downloading then become simple Windows file copy operations.

In Webdrive, you’ll need to load your private key, and then specify it in the configuration for a specific SFTP connection.

The Certificates tab of Webdrive’s Settings dialog, has a Hostkey Managemet button:
Webdrive Settings dialog
Push that, and you’ll get the host key management dialog, and on that you’ll find an Import button. Press that to import your public and private keys:
Webdrive Hostkey Import dialog

Specify the “.pub” key for the public key you generated earlier. The private key should also be specified, and would be the “.key” file. If you passphrase protected your key file, you can specify that here as well. Give it a recognizable name.

The second step, then, takes us back to the Webdrive main window:
Webdrive dialog
Click on a connection (or create a new one). In the Properties for that connection, on the SFTP tab will be a setting Enable client hostkey support for this site:
Webdrive dialog
Here you’ll find a dropdown list of the keys you imported above, and a place to enter the password, if any, to access that key.

Once completed, Webdrive should now be able to connect to your public key authenticated site.

WS_FTP

Having created a key pair already in WS_FTP, using it is simply a matter of defining your connection to use it.

When you create a site, specify its connection type as SFTP/SSH. Specify a user name, but leave your password blank. At the end of the wizard, click on the Advanced button, this will allow you to edit the connection, and is the equivalent to editing an existing connection.

Click on the SSH item on the left, and the dropdown list that results should allow you to select the key pair that you created earlier.

Assuming that the public key you exported and sent to your system administrator has been installed on the server, you should now be able to connect.

psftp

PSFTP is command line FTP program that is distributed with PuTTY. More importantly, it supports public key SFTP by using the “.ppk” file that you created for PuTTY above. Connecting using a public key is simply a different set of comment line options:

psftp -l username -2 -i keys.ppk
remotehost

-l username specifies your username on the remote host; -2 indicates that PSFTP should use SSH protocol version 2;
-i keys.ppk specifies the location of your private key as created with PuTTYgen; remotehost is the name of the remote host you’re connecting to.

Do this

Subscribe to Confident Computing! Less frustration and more confidence, solutions, answers, and tips in your inbox every week.

I'll see you there!

23 comments on “How Do I Create and Use Public Keys with SSH?”

  1. It seems as though sftp and ssh CAN NOT BE USED together.

    When I invokes sftp (first) the server asks me to authenticate the public key then continues conneting.

    Afterwards when I invoke ssh I receive a msg indicating the key is already present and it WILL NOT connect.

    Any suggestions

    Reply
  2. It sounds like a configuration issue on your server side. I regularly do exactly what you describe without problems, on several servers.

    Reply
  3. Great article! I’m using FTPShell which requires the private key to be in the PEM format. Can I convert PuttyGen’s PPK output to PEM? If not, there another program that can generate a PEM formatted private key?

    Reply
  4. Using Putty Key Generator, if I choose “Save Private Key”, the only “save as” file type is ppk.

    There are also two Conversion options, “Export OpenSSH Key” and “Export ssh.com Key” Neither of these options provide a specific file type such as PEM.

    How does one generate a PEM formatted private key?

    Reply
  5. Hi,
    Can u Please explain me
    how can we use the keygen tool generate the public key authentication in unix so that i need to use that in the java programs

    in Clear:
    I am generating the key pair using keygen tool in unix and using that keys in java programs where it is failing.
    can we use like this?
    please clarify

    Thanks & Regards
    KR

    Reply
  6. Hi,
    Do we have any open source to manage keys? Any open source to give certificate of authenticity?

    Regards,
    Vineet

    Reply
  7. Hi ive been researching on this topic for 3 days and now that im so close it seems to some what fustrating not to get the sftp server up and running as i would like.

    My question is how should i add the public keys to my server? do i just copy and paste the text into the server end
    “security certificate” in the allocated place for public keys and viseversa in the client end for the private keys etc?

    please help

    thanks

    paul

    Reply
  8. —–BEGIN PGP SIGNED MESSAGE—–
    Hash: SHA1

    Public keys are placed in the file authorized_keys in the .ssh sub directory of
    the account’s home directory. It’s definitely a particular format, a single
    line:

    ssh-rsa TypicallyLongPublicKeyValue

    and probably needs a particular permission setting. I typically set the file
    and the .ssh directory to be rw and rwx respectively for the owning account
    only).

    Leo

    —–BEGIN PGP SIGNATURE—–
    Version: GnuPG v1.4.6 (MingW32)

    iD8DBQFGdsMBCMEe9B/8oqERAub9AJsF9n8oP/Hwd2IugrVjruLcaYrWywCeKFe8
    ZSAhEqhBqNs8lMYiDLUrQBI=
    =0GIJ
    —–END PGP SIGNATURE—–

    Reply
  9. Thanks for posting this info. This is the first time I have needed to create and use a SSH key. I got everything set up and working well using Putty thanks to you. Much Appreciated!

    Reply
  10. i want to use psftp command in script file as i need to get some file for FTP through .PPK file but problem is putty is not able recognise psftp command. i have tried setting path for psftp. what can be the reason ?

    Reply
  11. Thanks a lot for the writeup… I am a beginner to SFTP and I am sure I came out a long way at the end of this doc… :)

    Regards,
    Zach

    Reply
  12. Hi,
    My requirement is to receive files from a unix machhine(SFTP server) to a windows machine.I have already generated the public key and private key using puttygen.

    I have generated the keys using a remote logon on the windows.Do the ID’s be same on the Unix and windows box or can I use the login credentials of the unix box in the psftpcommand line prompt.

    Regards,
    Vamsi

    Reply
  13. Hi,
    I wanted to use SFTP as file transfer protocol using putty. I have created Public as private keys as per the above instruction.
    But want to know how to use it?
    Is one server will have only one private and public key or more than on keys?

    Reply
  14. Hi,
    I wanted to use SFTP as file transfer protocol using putty. I have created Public as private keys as per the above instruction.
    But want to know how to use it?
    Is one server will have only one private and public key or more than on keys?

    Reply
  15. Thank you for this! However, I keep getting the same error: Permission denied (publickey). Any advice? thanks!

    Reply
  16. Leo, you wrote:

    “It will ask you to move the mouse around to generate randomness. (Randomness is a key component of public key cryptography).

    Yes: it certainly is! But IMHO, the “mouse-movement” algorithms commonly used for generating randomness are way overrated — the user typically responds with quite predictable movements: wide, sweeping motions back and forth, up and down, and/or wide circles. I know: I’ve done it, too. And I’m never really content with the resulting “randomness.”

    With the advent of services like HotBits (https://www.fourmilab.ch/hotbits), pools of TRUE RANDOM entropy are quite accessible, and I would strongly encourage the use such services — if only more programs would provide an option for the user to specify a source file of trusted entropy!

    Some encryption programs — VeraCrypt among others, yay! — already offer an option to further encrypt a target using an additionally specified file, called a “keyfile” — an MP3 or WAV file, for example (but neither one a good choice, in my opinion). Needless to say, I avail myself of this option, using large “random byte” keyfiles derived from HotBits (I actually mathematically “combine” two separate such files for extra security).

    I am totally satisfied with the resultant security. :) :) :)

    Reply
    • If you create your own .mp3 or .wav file, it should be quite random. Still, if it uses the ascii value of the media file, it would be extremely difficult to guess which song or clip (and more specifically which portion) you used so I’d imagine it’s pretty safe.

      Reply
  17. Leo, you wrote:

    “The public key will be placed on the server by your system administrator, giving you access.”

    Could you please elaborate on this? The “system administrator” is often the user himself; what “server” does one place the file on, and how does one place it there?

    Reply
    • Remember, SSH is all about accessing a (usually Linux) server remotely, typically via the (usually Linux) command line. So, for example, it’s how I access the askleo.com server. So, yes, particularly when you’re doing web hosting on Linux servers and such, there absolutely is an administrator other than yourself. Again depending on your hosting, you may be the administrator, in which case you’ll have access to some kind of interface that will allow you to upload the public key.

      Reply

Leave a reply:

Before commenting please:

  • Read the article.
  • Comment on the article.
  • No personal information.
  • No spam.

Comments violating those rules will be removed. Comments that don't add value will be removed, including off-topic or content-free comments, or comments that look even a little bit like spam. All comments containing links and certain keywords will be moderated before publication.

I want comments to be valuable for everyone, including those who come later and take the time to read.