Tutorial

How To Set Up SSH Keys on Ubuntu 12.04

How To Set Up SSH Keys on Ubuntu 12.04
Not using Ubuntu 12.04?Choose a different version or distribution.
Ubuntu 12.04

Introduction

The Secure Shell Protocol (or SSH) is a cryptographic network protocol that allows users to securely access a remote computer over an unsecured network.

Though SSH supports password-based authentication, it is generally recommended that you use SSH keys instead. SSH keys are a more secure method of logging into an SSH server, because they are not vulnerable to common brute-force password hacking attacks.

Generating an SSH key pair creates two long strings of characters: a public and a private key. You can place the public key on any server, and then connect to the server using an SSH client that has access to the private key.

When the public and private keys match up, the SSH server grants access without the need for a password. You can increase the security of your key pair even more by protecting the private key with an optional (but highly encouraged) passphrase.

Note: If you are looking for information about setting up SSH keys in your DigitalOcean account, please refer to our DigitalOcean product documentation on SSH Keys

Step 1 — Creating the Key Pair

The first step is to create a key pair on the client machine. This will likely be your local computer. Type the following command into your local command line:

  1. ssh-keygen -t ed25519
Output
Generating public/private ed25519 key pair.

You will see a confirmation that the key generation process has begun, and you will be prompted for some information, which we will discuss in the next step.

Note: if you are on an older system that does not support creating ed25519 key pairs, or the server you’re connecting to does not support them, you should create a strong rsa keypair instead:

  1. ssh-keygen -t rsa -b 4096

This changes the -t “type” flag to rsa, and adds the -b 4096 “bits” flag to create a 4096 bit key.

Step 2 — Specifying Where to Save the Keys

The first prompt from the ssh-keygen command will ask you where to save the keys:

Output
Enter file in which to save the key (/home/sammy/.ssh/id_ed25519):

You can press ENTER here to save the files to the default location in the .ssh directory of your home directory.

Alternately, you can choose another file name or location by typing it after the prompt and hitting ENTER.

Step 3 — Creating a Passphrase

The second and final prompt from ssh-keygen will ask you to enter a passphrase:

Output
Enter passphrase (empty for no passphrase):

It’s up to you whether you want to use a passphrase, but it is strongly encouraged: the security of a key pair, no matter the encryption scheme, still depends on the fact that it is not accessible to anyone else.

Should a private key with no passphrase fall into an unauthorized user’s possession, they will be able to log in to any server you’ve configured with the associated public key.

The main downside to having a passphrase — typing it in — can be mitigated by using an ssh-agent service, which will temporarily store your unlocked key and make it accessible to the SSH client. Many of these agents are integrated with your operating system’s native keychain, making the unlocking process even more seamless.

To recap, the entire key generation process looks like this:

  1. ssh-keygen -t ed25519
Output
Generating public/private ed25519 key pair. Enter file in which to save the key (/home/sammy/.ssh/id_ed25519): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/sammy/.ssh/id_ed25519 Your public key has been saved in /home/sammy/.ssh/id_ed25519.pub The key fingerprint is: SHA256:EGx5HEXz7EqKigIxHHWKpCZItSj1Dy9Dqc5cYae+1zc sammy@hostname The key's randomart image is: +--[ED25519 256]--+ | o+o o.o.++ | |=oo.+.+.o + | |*+.oB.o. o | |*. + B . . | | o. = o S . . | |.+ o o . o . | |. + . ... . | |. . o. . E | | .. o. . . | +----[SHA256]-----+

The public key is now located in /home/sammy/.ssh/id_ed25519.pub. The private key is now located in /home/sammy/.ssh/id_ed25519.

Step 4 — Copying the Public Key to Your Server

Once the key pair is generated, it’s time to place the public key on the server that you want to connect to.

You can copy the public key into the server’s authorized_keys file with the ssh-copy-id command. Make sure to replace the example username and address:

  1. ssh-copy-id sammy@your_server_address

Once the command completes, you will be able to log into the server via SSH without being prompted for a password. However, if you set a passphrase when creating your SSH key, you will be asked to enter the passphrase at that time. This is your local ssh client asking you to decrypt the private key, it is not the remote server asking for a password.

Step 5 — Disabling Password-based SSH Authentication (Optional)

Once you have copied your SSH keys onto the server, you may want to completely prohibit password logins by configuring the SSH server to disable password-based authentication.

Warning: before you disable password-based authentication, be certain you can successfully log onto the server with your SSH key, and that there are no other users on the server using passwords to log in.

In order to disable password-based SSH authentication, open up the SSH configuration file. It is typically found at the following location:

  1. sudo nano /etc/ssh/sshd_config

This command will open up the file within the nano text editor. Find the line in the file that includes PasswordAuthentication (or create the line if it doesn’t exist), make sure it is not commented out with a # at the beginning of the line, and change it to no:

/etc/ssh/sshd_config
PasswordAuthentication no

Save and close the file when you are finished. In nano, use CTRL+O to save, hit ENTER to confirm the filename, then CTRL+X to exit.

Reload the sshd service to put these changes into effect:

  1. sudo systemctl reload sshd

Before exiting your current SSH session, make a test connection in another terminal to verify you can still connect.

Conclusion

In this tutorial we created an SSH key pair, copied our public key to a server, and (optionally) disabled password-based authentication completely.

For more information about SSH and the SSH service, including how to set up multifactor authentication, please read our related tutorials:

We’ve made it super easy to add SSH Keys to your new or existing DigitalOcean virtual machines.

Learn more here

About the authors


Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
110 Comments
Leave a comment...

This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

If you don’t have ssh-copy-id you can use the following command: cat ~/.ssh/id_rsa.pub | ssh user@machine “cat >> ~/.ssh/authorized_keys”

alexdo
Site Moderator
Site Moderator badge
February 27, 2024

Heya,

Yes this should also work, but I’ll still recommend using ssh-copy-id to copy the public key to the droplet.

Regards

Moisey Uretsky
DigitalOcean Employee
DigitalOcean Employee badge
August 20, 2012

Hey Matt,

Great suggestion, we’ll update the article with that.

Dear Digital Ocean. You guys make the best tutorials. Thank you so much.

Great article, but what if your client is a Windows box and you’ve generated your public key with Puttygen, then need to transfer it to your VPS? Is there any way to copy-paste the public key, for example using nano? I’d rather not create a completely new server using the ‘Addendum’ method.

Moisey Uretsky
DigitalOcean Employee
DigitalOcean Employee badge
January 20, 2013

If you are copying the key over to a server you can certainly SSH and in and use nano/vi or any other editor and copy and paste it in. Just make sure that the formatting is preserved and no new line characters are added.

If I misunderstood the question let me know.

Wow, thanks for the quick reply on a Sunday night :-) I tried that and must have made a mistake as I couldn’t get it to work. I had created a way too large DSA key anyway. Since I’m trying to learn anyway, I’ve decided to recreate a droplet from scratch and get this down before I proceed. I’ll try integrating the SSH key through your ‘addendum’ method next time. I’m assuming I can just copy-paste the entire key, or do I have to omit lines like '---- BEGIN SSH2 PUBLIC KEY ---- Comment: “rsa-key-20130121”?

Moisey Uretsky
DigitalOcean Employee
DigitalOcean Employee badge
January 21, 2013

I think you may be looking at the wrong file possibly, because when the key is created the public one that you should be sharing doesn’t have any comments, so you can copy and paste it directly.

Please make sure that you are copying and pasting from the file that ends in “.pub”

I’m pretty sure I had the correct file, but to make sure I’ve put an exact copy/paste on Pastebin: http://pastebin.com/Hzi30uMM Apparently puttygen adds lines Linux doesn’t?

Moisey Uretsky
DigitalOcean Employee
DigitalOcean Employee badge
January 21, 2013

On Linux you would get : ssh-dss AAAAB3NzaC1yc2EAAAABJQAAAQEAgj… user@host

That should all be on one-line, the ssh-dss portion is because the key was created with dsa instead of rsa.

But thats what it should look like and you should paste it in on one line.

Right. Just to make sure I’ve got everything down correctly: if my username were ocean and my IP were 185.14.185.149, and my key were in ssh2-rsa the correct format would be:

ssh-rsa [key with all line breaks removed] ocean@185.14.185.149

Which I can then add to the Digital Ocean control panel and will be integrated in any future droplets I create.

Correct? Thanks!

Moisey Uretsky
DigitalOcean Employee
DigitalOcean Employee badge
January 21, 2013

When you create the key it will be created with your username@host the key was created on, it’s not related to the user / IP you are sshing to. It’s also optional and not necessary to be included.

Thanks for the clarification; puttygen does not add username@host data so I was under the impression I would have to manually add it. I’ll leave it out then.

If you open the private key with puttygen, there’s a box with the public key in openssh format http://i.imgur.com/1Cv0kmu.png

Copy and paste that into ~/.ssh/authorized_keys

Do the usernames on the client and server have to match? Or are there restrictions on logging into root@server from non-root@client?

Bobby Iliev
Site Moderator
Site Moderator badge
August 8, 2024

Hey 👋

No, the usernames on the client and server do not have to match. You can log into root@server from non-root@client by specifying the server username in your SSH command like this:

ssh root@server

Make sure your SSH key is authorized on the server for the user you’re trying to log in as.

I cannot finish step 3. I get blah blah blah port 22: Connection refused

I changed the port as recommended by a previous tutorial.

if you’ve changed your port then you need to give your port id in step 3. something like: cat ~/.ssh/id_rsa.pub | ssh -p yourportid user@123.45.56.78 “mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys”

This comment has been deleted

    alexdo
    Site Moderator
    Site Moderator badge
    February 27, 2024

    Heya,

    If the ssh port is changed, then you need to specify the new port when you copy the public key over to the droplet.

    You can also use the ssh-copy-id tool to handle the process for you.

    1. ssh-copy-id -p $PORT -i ~/.ssh/mykey user@host

    Where you need to change $PORT with the actual ssh port.

    Regards

    I tried this on my amazon ec2 virtual machine (running ubuntu 12.10 32-bit server), and on my desktop machine (running ubuntu 12.10 desktop 64-bit) and it does not work. I checked the dir and there is nothing there, and when trying the commands to transfer the key it tells me there were no identities found.

    Okay it seems I was succesful this time, the only thing I did different is follow the tutorial. The first 2 times I entered a name for the file when asked for a name, and I also did use a password. I’m thinking it’s the former that made it not work, not sure why though. Anyhow…

    When trying to connect, it asks me for a password and I did not enter one upon configuration. I guess I’m locked out of my virtual machine.

    alexdo
    Site Moderator
    Site Moderator badge
    February 27, 2024

    You can reset the root password for your droplet and then update the ssh configuration to accept only pubkey authentication.

    https://docs.digitalocean.com/support/how-do-i-reset-my-droplets-root-password/

    Hope that this helps!

    Totally not working for me. I’m rebuilding my virtual machine for the second time.

    alexdo
    Site Moderator
    Site Moderator badge
    February 27, 2024

    Heya,

    I’m sorry to hear about your experience. In case you’re locked from your droplet you can always use the recovery console to access the droplet and change the ssh configuration.

    Also a root password reset is available if your key is not recognised for some reason and you do not have the root password.

    Regards

    Why enable root login over ssh at all? Add your normal admin user to the admin group, or add an entry to the /etc/sudoers file (as described in https://www.digitalocean.com/community/articles/how-to-add-and-delete-users-on-ubuntu-12-04-and-centos-6) and use sudo. If you need full root login, then just use sudo su - root

    alexdo
    Site Moderator
    Site Moderator badge
    February 27, 2024

    Heya,

    All Linux-based machines come with a default root user that has all privileges on the machine; by default, you always act as a root user (a superuser).

    It is considered a good security practise to disbale the root username and if anyone is interested into this can check our tutorial here:

    https://www.digitalocean.com/community/tutorials/how-to-disable-root-login-on-ubuntu-20-04

    Hope that this helps!

    One thing to note if you are moving the pub key manually and creating the authorized_keys file is to make sure it has it’s permissions set to 700.

    sudo chmod 700 ~/.ssh/authorized_keys

    Question about the Addendum: if I include my public key, will the root user still have a password? If the answer is no, that means step 4 won’t make any difference, correct?

    Etel Sverdlov
    DigitalOcean Employee
    DigitalOcean Employee badge
    March 19, 2013

    If you create the droplet with your SSH keys, the root user will not have a password. If you set the keys up later, the root user will have a password and step four would be helpful.

    What are the advantages to uploading the public key to Digital Ocean’s Addendum?

    Never mind. I found another tutorial.

    On Cent6, I created the .ssh directory as a user and it wouldn’t work until I replicated the permissions of root’s .ssh directory (755) and authorized_keys file (644).

    When i do this and locked me out of the server. Can you still access the server using the console of DigitalOcean within the control panel?

    Remove the need for any editor.

    $ sudo sed -ie “s/^PermitRootLogin without-password/#&/” /etc/ssh/sshd_config

    Personally, I would also change PermitRootLogin yes appropriately.

    If you have configured a different port for ssh(for example, port 54321), then you need to use this instead(with the quotes): ssh-copy-id “user@123.45.56.78 -p 54321” Can you please update the article?

    @kamaln7 @etel Could you please update the article? I am sure I am not the only one spending a lot of time encountering issues like the one mentioned here. Please bear in mind when writing your tutorials that not all of us can connect the dots between various tutorials so easily.

    alexdo
    Site Moderator
    Site Moderator badge
    February 29, 2024

    We will look into updating this information in the article. Thanks for your feedback.

    Regards

    alexdo
    Site Moderator
    Site Moderator badge
    February 29, 2024

    Heya,

    Yes if the ssh port is custom the ssh-copy-id command needs to replicate that. I’ll look into updating this.

    Regards

    Kamal Nasser
    DigitalOcean Employee
    DigitalOcean Employee badge
    May 6, 2013

    @Peter Oudenes: Yes. Our remote console does not rely on ssh and will work even if you’re locked out of ssh.

    How about an option to disable root login upon creation of the droplet? And taking it further, the option to create a new user (e.g. ‘admin’), add it to sudoers and give it the public key instead?

    It sure would save me some time!

    Thanks @nicholas.teeple!

    For CentOS 6, Instead of permissions 700 for ~/.ssh and 600 for ~/.ssh/authorized_keys…I had to set them to 755 and 644 respectively.

    after i follow the tutorial and when i tried to ssh using terminal it show this “Agent admitted failure to sign using the key.” And they prompt me for password

    Can anyone help?

    Kamal Nasser
    DigitalOcean Employee
    DigitalOcean Employee badge
    July 6, 2013

    @weeleetan Try running the ‘ssh-add’ command locally and then try to ssh in again.

    Hello,

    I’ve followed the instructions but I don’t get any reply from the server in step 3 when I add the public key. I use the ‘cat’ method because osx does not have ‘ssh-copy-id’

    I’ve generated new keys and given another name to the files.

    The copy of the public key seems to be ok though. I’ve checked authorized_keys on the server and it’s in there. But then, when I ssh root@myserver.com I’m prompted for the password.

    Any idea?

    Kamal Nasser
    DigitalOcean Employee
    DigitalOcean Employee badge
    July 30, 2013

    @kevin.purnelle: What’s the output of the following command?

    <pre>ssh -vvv user@yourdroplet</pre>

    @Kamal Thanks to your comment I could solve the problem. The output was very long so I decided to look for an answer before posting.

    Here I’m going to describe my steps as a SSH noob. I think it can be useful for any beginner like me.

    So, after running the above command: ssh -vvv user@yourdroplet I saw something about identity files. When I created the key, I specified a different rsa filename for Digital Ocean. digitalo_rsa instead of the default one. (I use it for something else) -> There was no mention of it.

    So after looking a little, I found two things.

    1. One can select an identity file when calling ssh like this: ssh -i /path/to/key_rsa user@mydroplet (and it works, I wasn’t asked for password)

    2. One can create a config file (well, it’s nicer that the command in 1) You have to go to your ~/.ssh folder and create a file named ‘config’ in there, you can add something like this:

    Host example.com HostName example.com User root IdentityFile ~/.ssh/digitalo_rsa

    You can add as many of these blocks as needed if you use various keys.

    Then you can simply > ssh example.com ;)

    main source: http://ivetetecedor.com/how-to-set-up-an-ssh-config-file-in-mac-os-x/

    alexdo
    Site Moderator
    Site Moderator badge
    February 29, 2024

    Heya,

    I’m glad that you’ve sorted this! Thanks for sharing the information, I always feel proud of our community members when they want to share their knowledge to help others!

    Regards

    Kamal Nasser
    DigitalOcean Employee
    DigitalOcean Employee badge
    July 31, 2013

    @kevin.purnelle: That is correct. Trust me, knowing how to look stuff up online can be really useful later on :D

    Hi,

    there should be an article that explains how to setup users + sudo + SSH key authentication and disable password authentication altogether + fail2ban + disable root login

    Just to keep it simple for people who don’t really know what they are doing :)

    This comment has been deleted

      alexdo
      Site Moderator
      Site Moderator badge
      February 27, 2024

      Heya,

      All this steps are covered by couple of tutorials that can be found on our docs. I do believe that the process is fairly simple, but everyone can always ask here in the community if they face difficulties to complete any of the steps throughout the configuration.

      Regards

      Kamal Nasser
      DigitalOcean Employee
      DigitalOcean Employee badge
      August 2, 2013

      @Julian: Re: users, sudo, SSH key auth, disabling root login; We have an article on that: https://www.digitalocean.com/community/articles/initial-server-setup-with-ubuntu-12-04 :]

      As for fail2ban: https://www.digitalocean.com/community/articles/how-to-protect-ssh-with-fail2ban-on-ubuntu-12-04

      You can disable password authentication by editing /etc/ssh/sshd_config and setting the PasswordAuthentication directive to ‘no’.

      what should i do as i have forgot my passphrase.How to retrieve my old passphrase or how to remove the old one create a new key pair? I am in danger please help me.

      Kamal Nasser
      DigitalOcean Employee
      DigitalOcean Employee badge
      September 3, 2013

      @tanin.cs07: You can’t retrieve a key’s passphrase. The only options you have are:

      1. Remember the passphrase
      2. Generate a new ssh key pair

      Back up your current ssh key:

      <pre>mv ~/.ssh/id_rsa ~/.ssh/id_rsa.bak rm ~/.ssh/id_rsa.pub</pre> Generate a new ssh key pair (this time, make sure you specify a passphrase you won’t forget):

      <pre>ssh-keygen -t rsa</pre> Reset your droplet’s root password using our control panel, log in to your droplet through the console, set PermitRootLogin to yes (Step 4), restart ssh and run this command locally (on your computer):

      <pre>ssh-copy-id root@droplet’sIP</pre> Then log back in to your droplet via SSH and redo Step 4 (set it to without-password and restart ssh).

      You should now be able to access your droplet.

      I’m using cygwin terminal to generate my public key but it returns a " -bash: ssh-keygen:? command not found " error please help

      Kamal Nasser
      DigitalOcean Employee
      DigitalOcean Employee badge
      September 6, 2013

      @gamesandgadgetz: Install the openssl cygwin package.

      password using our control panel, log in to -" error please help,ssh-keygen:? access your droplet.

      Reset your droplet’s root password using - my public key but it returns a " -mv ~/.ssh/id_rsa ~/.ssh/id_rsa.bak

      : users, sudo, SSH key auth, disabling root login; We have an article on that: specified a different rsa filename for Digital Ocean. digitalo_rsa instead of the default one. (I use it for something else) -> There was no mention of it.Warning: Permanently added ‘12.34.56.78’

      Thanks much for explaining in detail. I Was having idea about algorithms on public key and private key. When you explained conceptually on client and servers I got an overview about it in a very quick short of time.

      Thanks again

      Kamal Nasser
      DigitalOcean Employee
      DigitalOcean Employee badge
      September 12, 2013

      @annanagy49: I’m not sure what you mean – can you please explain in one comment?

      Create an alias like this: alias ssh-copy=“cat ~/.ssh/id_rsa.pub | ssh $1 ‘cat >> ~/.ssh/authorized_keys’”

      use like this ssh-copy user@127.0.0.1

      ssh-copy-id isn’t on OSX (ML) - but there’s a great article here: http://www.jacobtomlinson.co.uk/2013/01/24/ssh-copy-id-os-x/ which tells you how to install it….

      alexdo
      Site Moderator
      Site Moderator badge
      February 29, 2024

      Heyam

      For anyone using Homebrew you can install it with:

      brew install ssh-copy-id
      

      https://formulae.brew.sh/formula/ssh-copy-id

      Regards

      I hav? done exactly as on tutorial, copied content of Public Key to authorised_keys nut I am still getting password prompt when I login via ssh. What is wrong?

      Kamal Nasser
      DigitalOcean Employee
      DigitalOcean Employee badge
      November 1, 2013

      @info: Is it authorised_keys or authorized_keys?

      it is authorized_keys, sorry for mistake here. I got my root account working with SSH (with no password) but for my second user (not root) it does not work. How to make this work with my second user? Can I use the same public key?

      Kamal Nasser
      DigitalOcean Employee
      DigitalOcean Employee badge
      November 9, 2013

      @info: You can use the same public key, just make sure that the second authorized_keys is in /home/youruser/.ssh.

      yes, i did that several times with no luck. I have put public key in user’s authorized_keys folder and still got prompt for password. There is nothing I can faint in logs related to auth failure…

      I was trying to do this by adding an ssh key to an existing droplet. My first droplet had a password emailed to me. However after I added the key using cat .ssh/id_rsa.pub | ssh user@123.45.56.78 “cat >> ~/.ssh/authorized_keys” but I still get prompted for that original password?

      This was on Windows using the github provided command line.

      I decided to destroy the server and restart using the GUI.

      Any help?

      Oh I had to use ssh-add the key on the client.

      cat .ssh/id_rsa.pub | ssh user@123.45.56.78 “cat >> ~/.ssh/authorized_keys”

      should probably be changed to

      cat ~/.ssh/id_rsa.pub | ssh user@123.45.56.78 “cat >> ~/.ssh/authorized_keys”

      (added “~/” prefix to “.ssh/id_rsa.pub”)

      Kamal Nasser
      DigitalOcean Employee
      DigitalOcean Employee badge
      November 12, 2013

      @Dan: Updated. Thanks!

      Just a note on Debian, reload isn’t recognized, had to use sudo /etc/init.d/ssh restart

      alexdo
      Site Moderator
      Site Moderator badge
      February 29, 2024

      Thank you for sharing this note! It’s helpful for users working with Debian-based systems to know that the reload command may not be recognized in the context of restarting services like SSH. Using sudo /etc/init.d/ssh restart is a valid alternative for restarting the SSH service on Debian systems.

      Different Linux distributions may have variations in their service management commands, so it’s always good to double-check the specific commands and syntaxes required for the distribution you’re working with.

      Regards

      I tried copying the key and got the following error:

      /home/user/.ssh/authorized_keys: Is a directory

      How did that happen and what do I do?

      Kamal Nasser
      DigitalOcean Employee
      DigitalOcean Employee badge
      November 22, 2013

      @Ryan: Check if there are any files in it and if not you can safely remove it: <pre>sudo rm -r /home/user/.ssh/authorized_keys</pre> and then recreate it properly as a file.

      assuming I have my keys set up, what do I use for user and host names in my SFTP client? (transmit) I have other ssh keys set up fine with transmit but can’t get this to work.

      Kamal Nasser
      DigitalOcean Employee
      DigitalOcean Employee badge
      November 30, 2013

      @tim: Simply enter the username that you added the SSH key to and your droplet’s IP as the host.

      There is no help here for a Windows user for ssh login. Can y

      @alikkalfizal,

      What are you talking about, Willis? Check out <a href=“https://www.digitalocean.com/community/articles/how-to-create-ssh-keys-with-putty-to-connect-to-a-vps”>How To Create SSH Keys with PuTTY to Connect to a VPS | DigitalOcean</a>.

      Couldn’t enable so I rebuilded it and did the following steps:

      1. Follow step 1-4 of this tutorial (https://www.digitalocean.com/community/articles/initial-server-setup-with-ubuntu-12-04)
      2. Enable SSH Key

      Everything works great.

      It was driving me crazy for ages that I still needed to use a password after setting up the SSH keys. I even lost a precious AMS droplet, because I wanted to redo everything from scratch. The final solution after trial and error, was that authorized_keys was not the same as the public key in my client. I deleted authorized_keys and instead of using ssh-copy-id, I used the alternative “cat” method. That worked perfectly first time.

      I kept getting a “file does not exist” error using the cat command… I ended up using this command instead, makes since since I think I had make the authorized_keys folder: cat ~/.ssh/id_rsa.pub | ssh <REMOTE> “(cat > tmp.pubkey ; mkdir -p .ssh ; touch .ssh/authorized_keys ; sed -i.bak -e ‘/$(awk ‘{print $NF}’ ~/.ssh/id_rsa.pub)/d’ .ssh/authorized_keys; cat tmp.pubkey >> .ssh/authorized_keys; rm tmp.pubkey)”

      here’s the source:http://www.commandlinefu.com/commands/view/10228/...if-you-have-sudo-access-you-could-just-install-ssh-copy-id-mac-users-take-note.-this-is-how-you-install-ssh-copy-id-

      hope it helps someone, and thx for the nice tutorials making life easier for a noob like me :D

      While SSH Key is indeed more secure, this top answer shed some light

      http://security.stackexchange.com/questions/33381/ssh-password-vs-key-authentication

      You make a great tutorials, but you starting from recommendation changing ssh port, and that’s makes impossible to send the ssh key to remote host using the method you provide here… The same like you recomend to disable root login but don’t provide any solution how to manage files using sftp client, where you can’t “su root” to see the files.

      I agree, it is often difficult to connect the dots between the tutorials or to find out what could be wrong

      I’ve confirmed that my keys are in the authorized_keys file for both root (~/.ssh/authorized_keys) and my created user (/home/[myname]/.ssh/authorized_keys). But I still can’t login without password. Very frustrated.

      OK, finally got a 'nix friend to help out. What I needed to do was to login with:

      ssh -i ~/.ssh/digitalocean_rsa user@host

      I’m on MacOS Mavericks and my droplet is Ubuntu 12.04.3. I generated a separate key name for this and I needed to confirm that this key was in my known_hosts file on my client machine. But none of it worked until I did the login passing in my private key and it added it to my Mac keychain.

      alexdo
      Site Moderator
      Site Moderator badge
      February 27, 2024

      Heya,

      I’m glad that you’ve sorted this! I would assume you have several ssh-key pairs and thus the initial ssh attempt was not successful. In cases like this you’ll most probably end up specifying the correct ssh-key to be able to connect.

      Regards

      Is it possible to do this with a new user account and not the root? i was trying to do this on a new user, thanks

      Kamal Nasser
      DigitalOcean Employee
      DigitalOcean Employee badge
      February 8, 2014

      @codetempo: Yes, it’s possible to do it on a regular user account.

      There’s a very cool port of ssh-copy-id for osx

      How can I set it up to allow both SSH SFTP and SSL SFTP? I’m trying to install a wordpress template and it doesn’t like SSH SFTP, only SSL SFTP.

      I 'm trying to copy the Public key to my droplet using: ssh-copy-id myuser@111.222.333.444 -p1234

      It results in this timeout: connect to host 111.222.333.444 port 22: Operation timed out

      I have setup a basic firewall vith iptable restrictions using the D.O. guide. Port 1234 has been setup as a SSH exception following the D.O. guide.

      Seems like the request for the designated SSH port 1234 gets ignored as it defaults to port 22.

      Any ideas?

      Thanks, nicholas.teeple on your suggestion. I finally got putty to authenticate my new user properly by setting permissions: ~/.ssh to 755 and ~/.ssh/authorized_keys to 644

      HI, thank you for article. If I added one ssh key, how I can add another computer? Sorry for this question - I’m new to this

      Kamal Nasser
      DigitalOcean Employee
      DigitalOcean Employee badge
      February 24, 2014

      @foykes: Simply append the second ssh key to the authorized_keys file (on a new line).

      On my home computer I successfully created the keys, but then when I used the copy id it told me “no identities found”

      maybe a step

      mkdir ~/.ssh
      

      on the host should be added as this directory is not available from scratch when a new user has been added (it is mentioned somewhere above but not to clear imho).

      I expect I’ll be working with multiple machines using SSH, as I like this way of doing things (oh yeah, I’m a linux noob)…so although I’ve never seen anyone recommend this, I’ve been naming my ssh key files by prepending a name that helps me understand what the key is for (as I expect to have multiple in my ~<me>/.ssh folder).

      Something to remember when doing this >>> Use the -i option to point to the correct key files when signing in via ssh (see man ssh for details).

      One more thing, if you are having trouble signing in, use the -vvv option (per William at DO - thanks William) - it will show you lots of stuff, and that’s how I figured out I need to specify the name of the key file (it was assuming the standard id_rsa)

      These tutorials are great btw.

      I am on Windows and can’t do the ssh-copy-id. I am using the second method but I get a ‘cat: /home/username/.ssh/authorized_keys: No such file or directory’ error. I created the .ssh dir, but I am getting the same message. I also created an authorized_keys dir, but still the same.

      This will not work unless the permissions are correct. Check with these commands on your Droplet. Of course, replacing ‘user’ with your username:

      chown -R user ~user/.ssh chmod -R go-rwx ~user/.ssh

      If you disable the login through password, and for some reason you lost your public key (for instance, the HD of your laptop broke), how would you log in back again? Wouldn’t you be locked out of your VPS?

      Kamal Nasser
      DigitalOcean Employee
      DigitalOcean Employee badge
      March 30, 2014

      @Enrique: You can use the Remote Console to log in to your droplet as it connects to it through the hypervisor so you can use it even if you’re locked out.

      I had no issues creating the key and using ssh-copy-id, but for some reason i’m not being asked for the passphrase i set in order to log on. Is there something i need to do to get this part to work?

      There is an article about SSH login without password which in very detailed explanation. http://namhuy.net/2433/ssh-login-without-password.html

      which one you prefer dsa or rsa?

      alexdo
      Site Moderator
      Site Moderator badge
      February 27, 2024

      Heya,

      Both RSA and DSA keys have been widely used for SSH authentication, and both provide strong security when used with appropriate key lengths. However, it’s worth noting that DSA keys are less commonly used compared to RSA keys.

      Hope that this helps!

      For beginners on a Mac I would recommend this tutorial: http://content2zero.com/setting-ssh-keys-access-cpanel-controlled-web-site-mac

      alexdo
      Site Moderator
      Site Moderator badge
      February 27, 2024

      Heya,

      Thanks for sharing this article.

      I will also recommend this article from our docs for # macOS users:

      https://www.digitalocean.com/community/tutorials/how-to-create-ssh-keys-with-openssh-on-macos-or-linux

      Regards

      @jenny33

      RSA is generally the preferred choice these days.

      I would add that “PermitRootLogin without-password” only applies to root exclusively, and no other users, which is misleading, because all users are mentioned in the article:

      “Within that file, find the line that includes PermitRootLogin and modify it to ensure that users can only connect with their SSH key:”

      I tested myself, you can still log in with a password for non-root users, hence brute-force attacks are possible.

      To disable password authentication, you must uncomment this line:

      PasswordAuthentication no

      alexdo
      Site Moderator
      Site Moderator badge
      February 27, 2024

      Heya,

      Thank you for bringing up this important clarification. Indeed, the PermitRootLogin without-password directive only applies to the root user, allowing root login with SSH keys only, while other users are not affected by this directive.

      To disable password authentication for all users, including non-root users, the correct directive to modify in the SSH configuration file (/etc/ssh/sshd_config) is PasswordAuthentication no

      Here’s the correct process:

      1. Open the SSH configuration file (sshd_config) in a text editor. You can use nano or vi:
      1. sudo nano /etc/ssh/sshd_config
      1. Find the line that includes PasswordAuthentication and modify it to:
      1. PasswordAuthentication no

      If the line is commented out (begins with #), remove the # to uncomment it.

      1. Save the changes and exit the text editor.

      2. Restart the SSH service for the changes to take effect:

      1. sudo service ssh restart

      By setting PasswordAuthentication no, you ensure that SSH access requires SSH keys for all users, effectively disabling password authentication. This enhances security by mitigating the risk of brute-force attacks.

      Regards

      I’m having an issue:

      I’ve got these lines in my ssh_config:

      PermitRootLogin no PasswordAuthentication no DenyUsers root

      I have restarted ssh.

      Yet, root is still able to login. And if root logs in, a password is requested.

      What could be going on here?

      Kamal Nasser
      DigitalOcean Employee
      DigitalOcean Employee badge
      April 10, 2014

      @sunil: Are you able to log in if you enter root’s password?

      i am trying to connect my windows laptop to linux server in which If i created the key from linux and copied into windows and made a private and public key then windows machine is not going to connect to whom from where we generated the key but i may connect to the rest of PC connected in lan parallely with linux machine from where we generate the key i don’t understand how to resolve this problem plz can any body help me

      Andrew SB
      DigitalOcean Employee
      DigitalOcean Employee badge
      April 17, 2014

      @zaid.atq: If you’re trying to connect to your Linux server from your Windows laptop, you can use Putty to generate the SSH keys on the laptop itself. Check out this tutorial:

      https://www.digitalocean.com/community/articles/how-to-create-ssh-keys-with-putty-to-connect-to-a-vps

      Bookmarked! Please don’t go down, ever :-)

      It would’ve been nice to see:

      ~$ ls -al /home/demo/.ssh/

      (As I’m copying the -backed-up- files from another location && not 100% sure on what the permissions on the local machine should be :))

      ~/.ssh$ ls -la total 24 drwx------ 2 home home 4096 Apr 25 22:42 . drwxr-xr-x 22 home home 4096 Apr 25 22:39 … -rw-r–r-- 1 root root 291 Mar 7 09:39 config -rw-r–r-- 1 root root 3326 Mar 17 2013 id_rsa -rw-r–r-- 1 root root 743 Mar 17 2013 id_rsa.pub -rw-r–r-- 1 root root 1774 Feb 28 10:00 known_hosts

      (Came as ^^ and needs changing 4 sure)

      Andrew SB
      DigitalOcean Employee
      DigitalOcean Employee badge
      April 28, 2014

      @ooydoboora: Here’s what the permissions look like when freshly generate by ssh-keygen:

      <pre> ls -la ~/.ssh total 20 drwx------ 2 root root 4096 Apr 28 10:42 . drwx------ 4 root root 4096 Apr 18 11:59 … -rw------- 1 root root 795 Apr 28 09:55 authorized_keys -rw------- 1 root root 1675 Apr 28 10:42 id_rsa -rw-r–r-- 1 root root 399 Apr 28 10:42 id_rsa.pub </pre>

      If you’re having trouble getting passwordless ssh on Red Hat Enterprise Linux 6.5, the SELinux feature may be preventing sshd from reading $HOME/.ssh is to use restorecon, a little more context is at http://superuser.com/a/764020/213743.

      root@sshd-server# restorecon ~/.ssh

      Do not forget check permissions 700 on directory and 600 on files and check to right owner. Directory /.ssh/ and all files should have owner who is owner home directory. It is usually is a login name.

      This is not working. I do not want to login to server in order to approve some ssh key. I want to be able to use it immediately after droplet creation.

      I do not have root access (root pass). I created 15 droplets and non of ssh keys is working. My guess is that you should look into this.

      If you offer start server with this ssh key during droplet setup then why is that i have to login to server in order to this to work. Stupid!

      Without the simple command ssh-add this tutorial will drive you absolutely mad.

      Very awesome tutorial.

      Try DigitalOcean for free

      Click below to sign up and get $200 of credit to try our products over 60 days!

      Sign up

      Join the Tech Talk
      Success! Thank you! Please check your email for further details.

      Please complete your information!

      Become a contributor for community

      Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

      DigitalOcean Documentation

      Full documentation for every DigitalOcean product.

      Resources for startups and SMBs

      The Wave has everything you need to know about building a business, from raising funding to marketing your product.

      Get our newsletter

      Stay up to date by signing up for DigitalOcean’s Infrastructure as a Newsletter.

      New accounts only. By submitting your email you agree to our Privacy Policy

      The developer cloud

      Scale up as you grow — whether you're running one virtual machine or ten thousand.

      Get started for free

      Sign up and get $200 in credit for your first 60 days with DigitalOcean.*

      *This promotional offer applies to new accounts only.