SSH Key - Still asking for password and passphrase
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.
Introduction
SSH, which stands for Secure Shell, is a protocol used to securely log in to remote systems. It offers strong authentication and secure encrypted data communications between two computers over an insecure network. Typically, SSH employs a public key cryptographic system for authentication. Users generate SSH key pairs; the public key is placed on the server to which they want to connect, and the private key is kept safe on their local machine. Despite setting up SSH keys, users may sometimes find that they are still being asked for passwords or passphrases. This article explores the technical reasons behind this issue and provides guidance on how to resolve it.
Understanding SSH Keys
When you create an SSH key pair, the objective is usually to simplify passwordless authentication. There are two components:
- Public Key: This key is stored on the remote server in a file typically named
~/.ssh/authorized_keys. - Private Key: This key stays private and secure, stored on your local machine, often in
~/.ssh/id_rsa.
When you attempt to connect to the server, the SSH client uses your private key to produce a signature that the server uses to verify against your stored public key.
Common Reasons for Password/Passphrase Prompts
Incorrect Permissions
SSH requires strict file permissions for key files to protect them from unauthorized access:
- Local Private Key: Should be readable only by the user. Set permissions with:
- Authorized Keys on Server: This file should also be properly secured:
Also, ensure the ~/.ssh directory behaves similarly:
Incorrect SSH Key
If you're directed to supply a password, there might be a mismatch between the keys. Double-check if you've uploaded the correct key to the server. Use:
Compare the output with the stored public key on the server.
SSH Key Passphrase
If your private key is secured by a passphrase, you'll be prompted to enter it unless you've set up an SSH agent to manage it. Add your key to the agent with:
To start the SSH agent:
SSH Configuration File
The SSH configuration file can specify key behavior, default keys, hosts, and configurations. This file is often found at ~/.ssh/config. Ensure it includes:
SSH Agent Forwarding
If connecting through multiple SSH connections (e.g., hopping through servers), you need to ensure SSH agent forwarding is enabled. Add this line to your SSH config:
Troubleshooting
- Verbose Mode: Use verbosity for troubleshooting:
It provides insights into the authentication process.
- Check SELinux: If Security-Enhanced Linux (SELinux) is configured on your server, it can sometimes interfere with SSH keys. Ensure it's configured to allow SSH.
- Server Logs: Check the server’s SSH logs for authentication errors (often found in
/var/log/auth.logor/var/log/secure).
Summary Table
| Issue | Solution |
| File Permissions | chmod 600 for keys, chmod 700 for .ssh directory |
| Key Mismatch | Verify key pairs using ssh-keygen -y -f |
| Passphrase Requirement | Use ssh-agent and ssh-add |
| SSH Config Errors | Confirm correct settings in ~/.ssh/config |
| Verbose SSH Output | Utilize ssh -vvv for troubleshooting steps |
| Agent Forwarding | Enable using ForwardAgent yes |
| Server Logs | Review /var/log/auth.log for further insights |
Conclusion
While SSH keys are an effective way to secure SSH communications without repeatedly entering passwords, configuration discrepancies can lead to prompts for passwords or passphrases. By examining permissions, SSH configurations, and employing tools like the SSH agent, you can often resolve these issues. If complications persist, analyzing both client-side and server-side logs will usually highlight the problem. As you implement these solutions, always adhere to best practices for SSH security to maintain a secure and efficient workflow.
Related reading
- ssh remote host identification has changed
- SSL and cert keystore
- SSL Certificate added but shows Kubernetes Ingress controller fake certificate
- SSL certificate rejected trying to access GitHub over HTTPS behind firewall
- SSL CERTIFICATE_VERIFY_FAILED in aws cli
- SSL InsecurePlatform error when using Requests package
- SSL certificates from Let’s Encrypt in your Kubernetes Ingress via cert-manager
- SSL handshake alert unrecognized_name error since upgrade to Java 1.7.0

System Design Fundamentals
Build a strong foundation in designing scalable, reliable distributed systems.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.