基于公钥认证的方式是相对来说比较安全的方式,避免了基于密码登录暴力破解的可能,避免了密码的泄露,同时便于ssh登录

过程:

在client端生成私钥和公钥,client与server协商通过公钥认证的方式来ssh登录,server ok。接下来client将自己的公钥传输给server,server收到public key(client)后,server产生一个随机数K,用public key(client)加密产生一个data(server),然后传送给client,这个过程称为质询报文,因为server需要确定client的身份,以免劫持。在client收到server发送过来的data(server)的时候,client用自己的private key(client)解密,得到一个随机数K。接下来,client用server的public key(server)将收到的随机数K加密生一个一个data(client),public key(server)是server端共享出去的公钥,自动传输的,client将data(client)发送给server,这个过程称为质询回报。server在收到data(client)后用自己的private key(server)将data(client)解密出来,得到一个随机数K,与之前送出去的随机数一核对,ok是一致,那么接下里就可以公钥认证了。

 

一、client端生成公钥和私钥

Java ssh 使用公钥登录 ssh 公钥认证_随机数

通过ssh-keygen(Linux client端)命令生成公钥和私钥,-t 后面跟的是算法类型,也可以跟其他算法,比如dsa。同时直接ssh-keygen回车,默认生成的也是rsa算法生成公钥和私钥。

标记2,表示私钥的默认位置为/root/.ssh/id_rsa,可以在此处定义私钥和公钥存放的目录

标记3,表示是否给私钥设置密码,这里可以密码为空

标记4,对私钥密码的再次确认

可以看到,在标记4之后生成了公钥和私钥,私钥location:/root/.ssh/id_rsa;公钥location:/root/.ssh/id_rsa.pub

标记5,表示生成的指纹,指纹是通过私钥得来的,用来识别身份,告诉server端我就是你需要找的client

 

二、非对称密钥生成之后,client将公钥(id_rsa.pub)传输给server

Java ssh 使用公钥登录 ssh 公钥认证_随机数_02

client通过ssh-copy-id 命令将公钥传送到server上,默认是id_rsa.pub公钥,可以指定公钥传输给server。但是在执行到最后,提示Permission denied,没有权限,拒绝连接。懵了,原因居然是第一次ssh连接时需要通过密码认证传输。因为个人server端sshd_config中密码登录设置了no,打开之后,就可以如下面一样传输上去了。(个人认为是公钥认证的实质是server端$HOME/.ssh/authorized_keys中是否记录了client的公钥,如果第一次ssh登录将PasswordAuthentication 设置为no,PubkeyAuthentication 设为yes,采用公钥认证,server端查看authorized_keys文件时,没有client公钥,所以拒绝连接,同时ssh-copy-id命令的实质就是在ssh,只是ssh-copy-id ssh上去只能传输文件,而ssh则是获得一个shell)

Java ssh 使用公钥登录 ssh 公钥认证_暴力破解_03

标记1,表示ssh-copy-id将传世公钥id_rsa.pub

标记2,是不是很眼熟,在ssh采用密码认证的时候,client需要确认server的指纹,判定该server就是我需要连接的server

Java ssh 使用公钥登录 ssh 公钥认证_root用户_04

client指纹与server ssh_host_ecdsa_key指纹比对,一致

标记4,ssh登录server验证root用户的密码

 

从client端将id_rsa.pub公钥传输到server端之后,就可以查看server端的$HOME/.ssh/authorized_keys是否记录了client的公钥

Java ssh 使用公钥登录 ssh 公钥认证_随机数_05

Java ssh 使用公钥登录 ssh 公钥认证_Java ssh 使用公钥登录_06

同时打开client端公钥,比对server authorized_keys内容,是一致的

接着关闭server端的密码认证方式,开启公钥认证方式,下图登录时就是不要密码登录,这里的密码是client在生产私钥时设置的私钥密码。

Java ssh 使用公钥登录 ssh 公钥认证_暴力破解_07

 

Java ssh 使用公钥登录 ssh 公钥认证_随机数_08

在进行ssh登录之前,将server端的PubkeyAuthentication yes,同时也要开启允许root登录权限

 

 

END