1. SSH的登录原理如图所示:
来源:https://www.jianshu.com/p/33461b619d53
- Client将自己的公钥存放在Server上,追加在文件authorized_keys中。
- Server端接收到Client的连接请求后,会在authorized_keys中匹配到Client的公钥pubKey,并生成随机数R,用Client的公钥对该随机数进行加密得到pubKey(R)
,然后将加密后信息发送给Client。 - Client端通过私钥进行解密得到随机数R,然后对随机数R和本次会话的SessionKey利用MD5生成摘要Digest1,发送给Server端。
- Server端会也会对R和SessionKey利用同样摘要算法生成Digest2。
- Server端会最后比较Digest1和Digest2是否相同,完成认证过程
2. 配置本机用户ssh无密访问localhost机器
(1)启动用户登录下,进入~/.ssh目录,通过ssh-keygen -t rsa命令生成公钥和私钥,之后一直回车:
[xxx@localhost .ssh]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/xxx/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/xxx/.ssh/id_rsa.
Your public key has been saved in /home/xxx/.ssh/id_rsa.pub.
The key fingerprint is:
21:46:2d:36:bb:34:73:xx:xx:xx:xx:xx:xx:xx:xx:xx xxxx@localhost.localdomain
The key's randomart image is:
+--[ RSA 2048]----+
| .. ... E |
| .+ . .= + . |
| .o+..o = + |
| .=... + + o |
| . =S o . .|
| . |
| |
| |
| |
+-----------------+
执行完了之后会在当前目录生成公钥(id_rsa_.pub)和私钥(id_rsa)文件。
(2) 配置authorized_keys授权文件,将公钥内容追加到authorized_keys中,(若是访问其他主机,则需要将公钥上传至目标机器并追加公钥内容至目标机器authorized_keys文件中)
若无该文件,touch authorized_keys 生成一个。
#若无authorized_keys则生成
touch authorized_keys
#一定要设置authorized_keys文件权限为600
chmod 600 authorized_keys
#追加xxx用户的公钥至授权文件中
cat id_rsa.pub >> authorized_keys
(3)验证是否可以无密码登录localhost
[xxx@localhost hadoop]$ ssh localhost
Last login: Fri Sep 7 01:27:12 2018 from localhost
如此未输入密码登录成功, 则证明ssh配置成功。
A机器要是访问B机器,则A机器生成公钥私钥,将A生成的公钥上传至B机器, 若通过U用户登录B机器,则追加A的公钥到U的home/U/.ssh目录中的authorized_keys文件。可以通过以下命令:
cat id_rsa.pub | ssh xxx用户名@主机ip或域名 'cat >> ~/.ssh/authorized_keys'
(4)Hostkey verification failed 问题
在~/.ssh目录下一般会存在authorized_keys和know_hosts两个文件:
authorized_keys:记录需要ssh无密码登录当前机器的远程登录请求方的公钥;
know_hosts: 记录当前机器成功登录过得远程机器的key,用于本地机器验证远程机器是否一致;
如, A机器远程无密码登录B机器,则A的公钥需要写入B机器 ~/.ssh/authorized_keys文件中,首次登录成功时会提示是否将B的机器key加入到A的~/.ssh/know_hosts中,则A保留了B机器的身份凭据。
A登录B出现Hostkey verification failed问题的原因是A中未保留正确的B的机器key。
可以删除A ~/.ssh/know_hosts中原有的B的机器key。再次尝试登录。
另外可以,尝试修改ssh的配置,root用户vi /etc/ssh/ssh_config, 将StrictHostKeyChecking 改成StrictHostKeyChecking no