一、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。