生成ssh公钥和私钥,authorized_keys和know_host
免登陆原理
免密登录原理通过RSA公开密钥算法的一种应用。RSA是公开密钥密码体制的一种使用不同的加密密钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制(非对称加密) 。在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的。
通俗的来说就是同时生成公钥和私钥,私钥自己保存,公钥发给其他人。
生成公钥和私钥
确保系统中有openssh,打开命令行输入下面命令后会自动在当前用户目录生成公钥和私钥
ssh-keygen -t rsa -C "xxxxx@xxxxx.com"
如图所示
把id_rsa.pub添加到github或gitee或需要添加公钥的地方就可以啦
连接测试
ssh -v -p 22 root@www.xxxx.com
authorized_keys
ssh会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告,避免受到攻击。
常规我们ssh连接到其他服务器的时候是需要输入密码的,这个文件中可以实现你的免密登录连接,只需要两步操作:
1、在要被连接的目标服务器上生成 ssh 公钥 xxx.pub(关键命令为 ssh-keygen 本文不做赘述)
2、将远程服务器上生成的 xxx.pub 中的内容,拷贝到当前服务器的 ~/.ssh/authorized_keys 中(不存在自己创建)
这样再进行 ssh 连接目标服务器的时候,就不会提示输入密码了,结果是直接连接成功。
known_hosts
第一次连接其他服务器的时候,会有一个一大串的提示 “Are you sure you want to continue connecting (yes/no)” 我们是否确认要连接到目标服务器。当我们确认后,这个远程服务器的信息就会被记录到我们本地的 ~/.ssh/known_hosts 中(如果一开始不存在则会自动创建),这个文件里面有我们刚刚连接的服务器的信息。
known_hosts 文件每连接一个新的远程服务器都会被追加产生一条新的数据记录。包括远程机器ip、远程机器公钥
当我们以后再连接之前连接过的目标服务器时,因为 known_hosts 文件中记录了我们曾经连接过,所有就不会在提示询问我们是否要连接了。
注意这两个文件是在用户目录中的,所以要和你当前用户对应,例如 root 用户就是 /root/.ssh/ 目录。
~/ 是引用当前用户主目录的写法。
有以下两个解决方案:
1、手动删除修改known_hsots里面的内容
2、修改配置文件"~/.ssh/config",加上这两行,重启服务器。文件不存在的话自己创建一个
StrictHostKeyChecking no UserKnownHostsFile /dev/null
如果域名指定ip变更了,此时就会验证失败,就需要删除里面对应记录,默认为22端口使用第一条命令删除,自定义端口使用第二条命令删除
ssh-keygen -R www.git.com ssh-keygen -R [www.git.com]:22022
总结
关于 authorized_keys和know_host的作用老是看一段时间就忘记,下面总结一下
authorized_keys是当前系统做服务端时用来保存客户的的公钥的,可提前把客户机的公钥保存到服务端的这个文件中省得输密码
know_host 是当前系统做为客户端时用来保存服务端发过来的公钥,默认情况下第一次连接时会有一个访问,yes后就会保存进去,主要是为了防止中间人攻击发送恶意公钥,所以才要你确认下