配置流程
客户端生成密钥对
ssh-keygen
这个命令是专门用来生成密钥的。下面列出基本的四个选项:
-t
用来指定密钥类型(dsa | ecdsa | ed25519 | rsa | rsa1
);-P
用来指定密语-f
用来指定生成的密钥文件名-C
用来添加注释
将公钥部署到服务器
ssh 免密登录的原理就是用户使用私钥加密,然后服务端使用公钥进行解密,从而验证用户身份。所以这里我们需要将自己的公钥部署到服务器上。
使用 scp
或者你的工具将公钥上传到服务器并将文件内容追加到 ~/.ssh/authorized_keys
中。例如:
#在本机上执行此命令,上传公钥
scp -P your_port host.pub user@hostname:/tmp
#在服务器上执行此命令,追加到authorized_keys
cd /tmp && cat host.pub >> ~/.ssh/authorized_keys
#更改权限
chmod 600 ~/.ssh/authorized_keys
修改服务器 ssh 配置
上传公钥后还需要在配置文件中打开公钥认证才行。
# 编辑 ssh 配置文件
sudo vim /etc/ssh/sshd_config
# 打开以下配置
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
重启 sshd
sudo systemctl restart sshd.service
# or
sudo service sshd restart
连接服务器
ssh -p port username@domain -i /path/to/private/key
xshell 之类的导入私钥即可。
禁止密码登录
为了更高的安全性,可以关闭密码登录,只使用密钥登录。
sudo vim /etc/ssh/sshd_config
# 找到以下语句
#PasswordAuthentication yes
# 改为
PasswordAuthentication no
# 保存重启
sudo systemctl restart sshd.service
BUG 记录
we did not send a packet, disable method
这个问题大部分资料都是说目录权限的问题,但在我这里目录权限是正确的。Google 了半天发现有人说他的是 public-key 的问题,前面少了个 s (详见这里)。然后去检查一下发现我的最前面也是少了个 s …… 这次诡异的 bug 就这么解决了……
Reference: https://unix.stackexchange.com/questions/131886/ssh-public-key-wont-send-to-server