如何通过配置密钥来实现 SSH 免密登录?
Configure SSH Key for Password-free Login
Base
SSH 客户端通过基于加密通讯的协议(Secure Shell Protocol),登录远程机器上并开启远程终端会话
关于 SSH 的更多细节请查阅手册:
man -s 1 ssh
- SSH 命令的常用字段
1 | ssh [user@]host [-p port] |
Generate SSH Key Pair
SSH 使用非对称加密算法生成密钥对,包括公钥和私钥。
SSH 支持的非对称加密算法包括:
- RSA(Rivest-Shamir-Adleman):基于大素数的质因数分解问题,最常见的公钥加密算法之一。
- DSA(Digital Signature Algorithm):数字签名算法,适用于签名和验证,但不适用于加密数据。
- ECDSA(Elliptic Curve Digital Signature Algorithm):基于椭圆曲线的数字签名算法,拥有比 RSA 和 DSA 更高的安全性和更小的密钥尺寸。
- Ed25519:基于椭圆曲线的数字签名算法,具有高性能和高安全性,同时提供了较短的密钥长度。
- Curve25519:基于椭圆曲线的密钥交换算法,用于生成密钥交换所需的公钥和私钥。
使用 ssh-keygen
来生成密钥对:
1 | ssh-keygen [-t dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa] |
如果 OS 是 Windows,生成的密钥对会存储在 C:\Users\username\.ssh
目录下,带.pub
后缀的文件是公钥文件
Copy Public Key to Remote Machine
在非对称密码体制中,通过公钥加密,私钥解密,
因此你需要在把之前生成的密钥对里面的公钥,发送到远程机器上。
Command: scp
首先通用的是 scp
命令,
scp
fomat:scp source ... target
其中
source
和target
可以被指定为
- 本地路径,如:
~/folder/filename
- 远程主机(可提供 path),如:
[user]@host:[path]
- URL,如:
scp://[user]@host[:port][/path]
先用 scp
把公钥文件复制到远程机器上:
1 | scp ./ssh_key.pub user@host:/home/user/.ssh |
然后在远程机器上,用 cat
配合标准输出把公钥文件追加到 ~/.ssh/authorized_keys
中:
1 | cat ~/.ssh/ssh_key.pub >> ~/.ssh/authorized_keys |
注意请使用 >>
而非 >
来执行流重定向,以把公钥文件追加至 authorized_keys
中,而不是覆盖 authorized_keys
中的内容。
Command: ssh-copy-id
其次,如果是在 linux 本地机器上发送到远程机器,可以选择 ssh-copy-id
命令,
ssh-copy-id format:
ssh-copy-id [-i [identity_file]] [user@]host
其中
identity_file
可以被指定为公钥文件
只需要简单一条命令(准确来说是一段 script):
1 | ssh-copy-id -i ./ssh_key.pub user@host |
然后公钥文件就会被自动地追加到远程机器的 ~/.ssh/authorizedkeys
文件里面了
Login via SSH without using a password
完成了上面两个步骤之后就能通过 SSH 无需密码口令地开启远程机器上的会话了