一、Xshell 免密登陆服务器
ssh登陆服务器的方式有:一种是最常见的通过用户名密码登陆,另一种是通过密钥登陆。
这里使用Centos Stream 10作为服务器演示。
使用密码登陆分4步:
1.客户端(Xshell)生成密钥(公钥、私钥)
2.将公钥(public key)放到服务器(Centos Stream 10)的 .ssh/authorized_keys文件中
3.配置ssh服务器使用密钥登陆。
4.Xshell设置使用密钥登陆。
1、Xshell生成密钥
这里以Xshell 5为例,在windows 10上演示。打开Xshell 5,点击“工具”–>“新建用户密钥生成导向”:

进入设置密钥参数页面:

密钥类型:RSA、DSA、ECDSA、ED25519
默认的是RSA,新版的openssh已经弃用rsa,所以选择ED25519,长度:256。点击“下一步”:

公钥已生成,点击“下一步”:

设置密钥名称、密码。这里为了方便演示,保持默认,直接点击“下一步”:

由于没有设置密码,弹出警告,点击“是”即可:

把公钥复制下来保存:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKxD8+RF8qKOkZtNG4z9eCMqAd+/415rfxMJqc/iZ2M2
另外,点击“保存为文件”保存到电脑上。最后,点击”完成“:

点击”导出“,可以导出私钥。

pub结尾的是公钥。
2、将公钥放到服务器上
这里为了方便演示,直接使用root用户。
使用root用户登陆CentOS Stream 10

如果authorized_keys已经存在,则使用方法2,不能使用方法1。如果authorized_keys不存在,方法1、方法2任选一个。
方法1:将公钥id_ed25519_256.pub放到root用户家目录下的.ssh目录中,然后将其改名为authorized_keys,并修改authorized_keys文件权限为600。
或者直接创建authorized_keys文件,并把id_ed25519_256.pub的内容复制黏贴到authorized_keys文件中,再把该文件权限改为600。
下面演示的是:将公钥id_ed25519_256.pub放到root用户家目录下的.ssh目录中,并将其改名为authorized_keys,并修改authorized_keys文件权限为600:
进入.ssh目录

在Windows10找到保存的公钥,直接拖过去即可(前提是CentOS服务器已经安装了lrzsz):

修改id_ed25519_256.pub文件名为:authorized_keys,命令如下:
[root@localhost .ssh]# mv id_ed25519_256.pub authorized_keys
如下图:

修改authorized_keys的权限为600:
chmod 600 authorized_keys
如下图:

如果authorized_keys文件已经存在,则不能使用方法1,使用方法2。
方法2:authorized_keys已经存在,则打开该文件,另起一行,将前面生成的公钥内容黏贴进去即可。
前面生成的公钥:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKxD8+RF8qKOkZtNG4z9eCMqAd+/415rfxMJqc/iZ2M2
把公钥内容复制黏贴到authorized_keys文件中即可,注意不要覆盖已有的内容。
3、服务器端配置使用密钥登陆
修改/etc/ssh/sshd_config配置文件
[root@localhost ~]# vim /etc/ssh/sshd_config
1、找到”#PubkeyAuthentication yes“ 把#去掉即可。
2、找到“#AuthorizedKeysFile .ssh/authorized_keys”把#去掉。
如下:
PubkeyAuthentication yes #开启密钥认证
AuthorizedKeysFile .ssh/authorized_keys #保存公钥的文件
【如果密钥使用RSA,则需要添加一行:RSAAuthentication yes 】,RSA在新版的openssh7.0中已经弃用。
【如果要取消密码登陆,则将#PasswordAuthentication yes改成PasswordAuthentication no。如果还要保存使用密码登陆,则无需修改。】这里,不修改,保持可以使用密码登陆。
【如果要禁止root远程登陆,则添加一行:PermitRootLogin no】这里只有root一个用户,所以不修改,保持root登陆。
修改完成后,保存退出,重启sshd服务:
[root@localhost ~]# systemctl restart sshd
4、Xshell设置密钥登陆
打开Xshell,点击文件夹–>选择主机–>点击配置

修改用户身份验证:

如下图:

方法:Public Key
用户名:root
密钥:选择id_ed25519_256,前面生成的。如果要添加其他密钥,点击浏览添加即可。
密码:因为前面生成密钥时没有设置密码,所以不用填。
点击“确定:即可。

点击”连接“:

登陆成功。
二、Linux免密登陆服务器
【如果客户端也是Linux系统,怎么使用密钥登陆另一台Linux服务器?】
ssh免密登陆原理示意图:

这里演示Ubuntu 使用密钥登陆CentOS Stream 10
客户端:Ubuntu 26(IP:192.168.0.3)
服务端:CentOS Stream 10(IP:192.168.0.131)
同样分4步:
1、Ubuntu 客户端生成密钥
2、将密钥传到CentOS Stream 10服务端
3、CentOS Stream 10服务端配置使用密钥登陆
4、Ubuntu 客户端密钥登陆测试
1、Ubuntu 生成密钥
执行ssh-keygen命令生成密钥。不添加任何参数,保持默认。为了简单,创建过程不设置任何参数,直接回车即可,如下图:

新版的openssh7.0中已经弃用rsa,所以默认是ed25519,可以使用-t参数,指定加密类型,比如:ssh-keygen -t rsa
ssh-keygen参数:
-b:指定密钥长度,比如:-b 2048
-t:指定密钥类型,类型有:RSA、ed25519、dsa、ecdsa等
-m:指定格式,比如:-m PEM,用PEM格式封装,兼容性最好,特别是老旧系统
-f:用来自定义文件名,比如:-f /root/.ssh/id_rsa,如果不指定,则为默认
-e:读取已有的公钥、密钥文件
-C:添加注释
2、将密钥传到CentOS Stream 10
执行命令:ssh-copy-id 用户名@服务器ip
将公钥传到服务器
root@localhost:~# ssh-copy-id root@192.168.0.131
这里使用root用户做演示。

【当然这里也可以使用前面的方法二】,将客户端ubuntud的公钥内容复制到服务端CentOS Strem的/root/.ssh/authorized_keys文件中。
ubuntu客户端生成的密钥保存在/root/.ssh目录中,如下:

用户家目录下.ssh目录文件解释:
id_ed25519:私钥
id_ed25519.pub:公钥
authorized_keys:存放授权过的无密登陆服务器的公钥
把公钥的内容:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBE/VJoN33ozOsB/4t78T6aWE1UOyqhLzYWVUQ7vkMe6 root@localhost
复制到服务端的/root/.ssh/authorized_keys文件中:

3、服务端(CentOS Stream 10)配置使用密钥登陆
前面已经配置了,这里不用重新配置
4、Ubuntu 密钥登陆测试
ubuntu端执行:ssh root@192.168.0.131

OK,成功用密钥登陆了CentOS。
【Xshell 5 使用rsa密钥似乎登陆不了CentOS Stream 10,但可以登陆CentOS 7,可能新版的Linux已经不支持rsa密钥登陆了】
三、windows创建密钥
win10、win11中基本内置了OpenSSH客户端(对于其他版本,需要自行安装OpenSSH)
1、打开Windows命令终端
按键盘的电脑键+R,弹出“运行”,输入cmd,确认

2、生成私钥和公钥
输入命令:
ssh-keygen -t ed25519
直接回车即可:

密钥成功后,默认存放在:C:\Users\用户名\.ssh文件夹中,如果当前用户是Administrator,则存放在C:\Users\Administrator\.ssh文件夹中,如下图:

id_ed25519:私钥,必须保存好,不要泄露
id_ed25519.pub:公钥
创建密钥过程中参数设置解释:
Enter file in which to save the key:设置密钥文件名,如果不设置,则使用默认的。这里为了演示方便,不设置。在实际应用中,为了区分,建议自定义文件名。
Enter passphrase:设置私钥的密码,直接回车表示不设置密码。这里演示不设置密码,实际中为了安全,建议设置密码
Enter same passphrase again:确认密码。
创建好密钥后,将公钥的内容复制黏贴到vps服务器的authorized_keys文件中即可。
比如,以vps服务器的root用户为例,使用root用户登录vps服务器后:
在root用户家目录中创建一个.ssh目录:mkdir .ssh
修改.ssh目录权限:chmod 700 .ssh
创建authorized_keys文件:vim .ssh/authorized_keys,把公钥内容黏贴进去保存即可。
修改authorized_keys文件权限:chmod 600 .ssh/authorized_keys
如果要免密登录其他用户,用其他用户登录vps服务器后在其家目录下创建authorized_keys文件,跟root方法一样。
然后就可以在windows端ssh连接登录vps服务器了。
四、ssh快捷登录
如果不使用xhell等图形化工具登录的话,使用命令:ssh -i 私钥 -p 端口 用户名@服务器ip,比如:
ssh -i ~/.ssh/vps_ed25519 -p 2222 root@192.168.0.100
即可登录vps服务器。
但是每次登录都要输入ip、用户名、私钥、端口等等,比较麻烦。因此可以本地创建ssh配置,快捷登录。
Linux端:
在用户家目录的.ssh目录中,创建一个名为:config文件,文件内容如下:
Host my-vps #名称,自定义,这里设置为my-vps
HostName 192.168.0.100 #服务器ip,根据实际修改
User root #用户名,根据实际填写
Port 22 #ssh服务端口,根据实际填写
IdentityFile ~/.ssh/vps_ed25519 #私钥文件,根据实际修改
IdentitiesOnly yes #强制SSH仅使用当前Host块中IdentityFile显式指定的私钥进行认,忽略ssh-agent中加载的其他密钥及默认密钥(如 ~/.ssh/id_rsa),跟IdentityFile同时使用
设置config文件权限:
chmod 600 ~/.ssh/config
登录vps服务器:
ssh my-vps
windows端:
SSH 配置文件通常位于:C:\Users\你的用户名.ssh\config
config内容跟linux端一样:
Host my-vps #名称,自定义,这里设置为my-vps
HostName 192.168.0.100 #服务器ip,根据实际修改
User root #用户名,根据实际填写
Port 22 #ssh服务端口,根据实际填写
IdentityFile ~/.ssh/vps_ed25519 #私钥文件,根据实际修改
IdentitiesOnly yes
然后,在windows命令行终端执行ssh my-vps命令,即可登录
五、密钥文件权限
.ssh目录一般权限700,authorized_keys公钥文件权限644或600,私钥文件权限600或者400。

六、公钥指纹
查看公钥是使用哪种加密方法生成:
ssh-keygen -lf 公钥
比如:
root@localhost:~# ssh-keygen -lf .ssh/id_ed25519.pub
256 SHA256:r1pgw8X0GSiLfYIVbSj7ahjGQR+Q9/vVmGVRcumEaj8 root@localhost (ED25519)
root@localhost:~#
结果显示的是使用ED25519。