SSH2连接原理 - 在A机上使用SSH连接B机
一,口令登录
(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连接。