SSH2连接原理

一,口令登录

(1)在A机使用命令<ssh|sftp user@host>连接B机

bash-4.2$ ssh user@www.xxx.net

  这段话的意思是,无法确认host主机的真实性,只知道它的fingerprint,问你还想继续连接吗?很自然的一个问题就是,用户怎么知道远程主机的公钥指纹应该是多少?回答是没有好办法,远程主机必须在自己的网站上贴出fingerprint,以便用户自行核对。所谓fingerprint,是指公钥长度较长(这里采用RSA算法,长达1024位),很难比对,所以对其进行MD5/SHA256计算,将它变成一个位位数很短的指纹。

The authenticity of host 'www.xxx.net (111.111.111.34)' can't be established.

RSA key fingerprint is SHA256:Z6DoSKxCQq4NGrGcQTcbWBC+hrZ38gqCLBNniHppaII.

RSA key fingerprint is MD5:a2:78:ca:03:db:40:41:cc:c2:44:17:15:65:44:4c:11.

(2)假定经过风险衡量以后,用户决定接受这个远程主机的公钥。

Are you sure you want to continue connecting (yes/no)? yes

(3)B机收到请求后,将自己的公钥发给A

  当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh2/hostkeys(SSH在$HOME/.ssh/known_hosts)之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。

(4)A收到公钥后,用公钥加密B的登陆密码,生成加密密文,发送给B

  有时候我们连接的是一个冗余或负载均衡的Server,fingerprint不是固定的,这个时候会出现"Host key verification failed"这样的错误。可以加<-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null>这两个参数来忽略hostkey check。

Password: xxxxxx

(5)B收到加密密文后,用自己的私钥解密,得到解密信息,然后与B的登陆密码做比较,正确则允许A登陆。

sftp>

二,公钥(免密)登录

(1)在A机器上生成public key和private key,一般目录在$HOME/.ssh2中。

(2)在B机器上安装A的public key,一般在$HOME/.ssh2/authorized_keys(存放远程连接主机的公钥,一行一个公钥,权限为600,可自定义,比如/etc/ssh/keys/user/)中。

(3)A向B发送连接请求,并带上自己的公钥。

(4)B收到A的公钥,检查机器上的授权列表是否包含有A的公钥,若存在,再生成一个随机数,使用公钥加密,生成加密密文发送给A。

(5)A收到加密密文后,用私钥解密,得到的结果发送给B。

(6)B收到A发来的结果,与之前生成的随机数作比较,一致则允许A连接。

原文地址:https://www.cnblogs.com/storml/p/14314421.html