- 生成SSH私钥和公钥。这一步可以在本地也可以在服务器上进行。这里我在本地Linux机(Windows用powershell就行了)上进行。
ssh-keygen #运行这串命令
Generating public/private rsa key pair.
Enter file in which to save the key (/home/illusion/.ssh/id_rsa): # 公私钥存储的路径和文件名。不输入则默认在~/.ssh/id_rsa
Enter passphrase (empty for no passphrase): # 私钥的口令,为了防止私钥泄漏时被滥用,默认为空,这里为了方便也留空
Enter same passphrase again:
Your identification has been saved in /home/illusion/.ssh/id_rsa
Your public key has been saved in /home/illusion/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:kH8nr/B9Qlfb9EPrmLWim8mAXLk+IPy2D4YhdhTQzYo illusion@localhost
The key's randomart image is:
+---[RSA 3072]----+
| .o.o |
| ..+ |
| ..+ |
| E.. o . .o|
| o.o Soo . .o=|
| . oo+.o..+. .=o|
| .o=oo ...= o|
| .oo+oo++.o |
| ..oo+*+o. |
+----[SHA256]-----+
- 这时候生成了私钥
id_rsa
和公钥id_rsa.pub
。私钥无论如何都不要给出去,如果这个私钥在创建时没有设置密码,那么得到这个私钥的人可以就可以连接任何一台使用对应公钥进行认证的服务器。而公钥需要传到服务器上面(如果你是服务器生成的公私钥,则把私钥传到本地,并且建议删掉服务器上的私钥)。要以哪个用户的身份登录到服务器,密钥就必须保存在该用户主目录的~/.ssh/authorized_keys
。这里配置是作为root的登录方式。
服务器仍然需要先开启密码登录,以使用SCP或SFTP传输文件(有其它方式也没问题)。
scp [-P ssh端口] ~/.ssh/id_rsa.pub root@服务器ip:/root/.ssh/
root@xx.xx.xxx.xx's password:
id_rsa.pub 100% 572 20.9KB/s 00:00
- 上传完成后再用SSH密码登录服务器,并将
id_rsa.pub
的内容追加到authorized_keys
中。
在服务器上
cd ~/.ssh
cat id_rsa.pub >> authorized_keys # 追加公钥到authorized_keys
chmod 644 ~/.ssh/authorized_keys # 设置authorized_keys的权限为只有拥有者有读写权限;而属组用户和其他用户只有读权限。否则sshd会拒绝读取
接着编辑/etc/ssh/sshd_config
的配置文件,去掉以下几行的注释以及修改属性:
PubkeyAuthentication yes
PasswordAuthentication no # 禁止密码登录。如果想在其它机器上用密码访问则还是保留yes
密码登陆可以先留着,免得发现公私钥连不上之后密码也连不上,导致机器失联
systemctl restart sshd # 重启服务 或service sshd restart
重连SSH就会立即生效了,表现为用终端直接ssh root@服务器 -p 端口
时不再需要输入密码。对于Linux本地机,如果用本身终端的SSH工具,不需要填写私钥文件路径;如果是第三方SSH工具,应该还需要额外配置这一项,倒不是什么难事(有些工具有坑,我用NextSSH 2.3.1版会直接跳"All configured authentication methods failed",但在Electerm能正常访问。所以访问失败的建议更新一下工具或换个试试。再不行检查一下是不是弄错了公私钥)。
ssh-copy-id
上传公钥的方法
ssh-copy-id -i [私钥文件] -p [ssh端口] [用户]@[服务器地址]
上传完后就能直接使用公私钥登陆了