生成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连接到服务器的时候是需要输入密码的,这个文件中可以实现你的免密登录连接,只需要两步操作:
1、在客户端ssh上生成 ssh 公钥 xxx.pub(关键命令为 ssh-keygen 本文不做赘述)
2、把生成的 xxx.pub 中的内容,拷贝到服务器的 ~/.ssh/authorized_keys 中(不存在自己创建)
这样再进行 ssh 连接目标服务器的时候,就不会提示输入密码了,结果是直接连接成功。
known_hosts
ssh会把你每个你访问过计算机的指纹都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会进行核对。如果不同,OpenSSH会发出警告,避免受到攻击。
第一次连接其他服务器的时候,会有一个一大串的提示 “Are you sure you want to continue connecting (yes/no)” 我们是否确认要连接到目标服务器。当我们确认后,这个远程服务器的指纹信息就会被记录到我们本地的 ~/.ssh/known_hosts 中(如果一开始不存在则会自动创建),这个文件里面有我们刚刚连接的服务器的信息。
known_hosts 文件每连接一个新的远程服务器都会被追加产生一条新的数据记录。包括远程机器ip、远程机器公钥(加密的)
当我们以后再连接之前连接过的目标服务器时,因为 known_hosts 文件中记录了我们曾经连接过,所有就不会在提示询问我们是否要连接了。
注意这两个文件是在用户目录中的,所以要和你当前用户对应,例如 root 用户就是 /root/.ssh/ 目录。
~/ 是引用当前用户主目录的写法。
如何跳过手动验证提示呢,有以下两个解决方案:
1、修改配置文件"~/.ssh/config",加上这两行,重启服务器。文件不存在的话自己创建一个
StrictHostKeyChecking no UserKnownHostsFile /dev/null
2、命令参数跳过验证
ssh -o StrictHostKeyChecking=no user@hostname
如果域名指定ip变更了,此时就会验证失败,就需要删除里面对应记录,默认为22端口使用第一条命令删除,自定义端口使用第二条命令删除
ssh-keygen -R www.git.com ssh-keygen -R [www.git.com]:22022
总结
关于 authorized_keys和know_host的作用老是看一段时间就忘记,下面总结一下
authorized_keys是当前系统做服务端时用来保存客户的的公钥的,可提前把客户机的公钥保存到服务端的这个文件中省得输密码
know_host 是当前系统做为客户端时,用来保存连接并且验证过的服务端的指纹,默认情况下第一次连接时会有一个访问,yes后就会保存进去,主要是为了防止中间人攻击发送恶意公钥,所以才要你确认下