ssh Host key verification failed 解决方案

本贴最后更新于 2238 天前,其中的信息可能已经渤澥桑田

1、问题

配置jenkins 最后一步需要使用scp命令 自动复制war包到服务器。提示:Host key verification failed.

2、原因

ssh连接的时候会验证authorized_keys及known_hosts,首先会验证authorized_keys是否存在本机id_rsa.pub中的公钥信息,如果验证成功会继续验证known_hosts信息,如果是第一次连接或者记录在known_hosts的ip等信息不匹配,ssh无法判断远程的服务端是否是正确的,在这里如果有人中截获了你的登录请求,并且模拟ssh服务端的话,你的密码就会泄漏(中间人攻击),所以ssh会询问你:远程服务端的指纹是:xxxx,是不是确定登录。

3、Public Key 认证

Public Key 认证是什么

这是一种认证方法,类似于常见的用户名密码认证方法。不同的是需要在客户端机器上保留一个很长很长的加密key,而在服务器端需要做出相应的配置。当客户端想要访问服务器时,服务器则会检查自身配置并根据客户端所提供的用户名来识别客户端。说白了就是实现了无密码访问,并同时兼有安全保障措施。

认证过程简要说明

Public key对数据进行加密而且只能用于加密,Private key只能对所匹配的Public key加密过的数据进行解密。我们把Public key放在远程系统合适的位置,然后从本地开始进行ssh连接。此时,远程的sshd会产生一个随机数并用我们产生的Public key进行加密后发给本地,本地会用Private key进行解密并把这个随机数发回给远程系统。最后,远程系统的sshd会得出结论我们拥有匹配的Private key允许我们登录

4、解决方案

1、把id_rsa.pub中的公钥复制到服务器authorized_keys中,然后指定不验证known_hosts,第一次成功之后本地known_hosts中会自动生成服务器ip等连接信息,然后删除StrictHostKeyChecking 参数即可。

scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no /app/server/jenkins/jenkins_home/workspace/xxx/target/pac-0.0.1-SNAPSHOT.war appuser@1.1.1.1:/opt/tomcat/webapps/ROOT.war

缺点:SSH登陆时会忽略known_hosts,安全性低 。

2、修改配置文件“~/.ssh/config”,加上,重启服务器。

StrictHostKeyChecking no    UserKnownHostsFile /dev/null 

缺点:安全性低,略暴力,不建议使用。

3、客户端和服务器都能手动连接上的情况,直接使用客户端ssh连接服务器,第一次连接之后known_hosts中会保存连接信息,下次即可免密登录。

缺点:逼格略低,不建议使用

4、使用expect

expect是提供自动交互的工具。

demo:

#!/usr/bin/expect
#set timeout 20 #设置超时时间
spawn ssh root@1.1.1.1
expect "*password:"
send "123\r"
interact

解释:

1.#!/usr/bin/expect :需要先安装软件,然后来说明用expect来执行

2.spawn ssh root@1.1.1.1 :spawn是进入expect环境后才可以执行的expect内部命令,用来执行它后面的命令。

3.expect "*password:" :也是expect的内部命令,用来解惑关键的字符串,如果有,就会立即返回下面设置的内容,如果没有就看是否设置了超时时间。

4.send "123\r":这时执行交互式动作,与手工输入密码等效,在expect截获关键字之后,它就会输入send后面的内容。

5.interact :执行完毕后把持交互状态,把控制台,这时候就可以进行你想要进行的操作了。如果没有这一句,在登陆完成之后就会退出,而不是留在远程终端上。

缺点:第一次执行完之后,注意删掉脚本,没有缺点.

注意

authorized_keys 600权限,.ssh文件夹700权限。

同样适用于 SFTP/SSH/SCP/GIT

可以参考

[ssh-the-authenticity-of-host-hostname-cant-be-established​] https://stackoverflow.com/questions/3663895/ssh-the-authenticity-of-host-hostname-cant-be-established

[centos7将pub文件加入authorized_keys以后还是要输入密码,解决方法​] https://blog.csdn.net/Rainloving/article/details/50378049

[​unixlinux-setting-up-public-key] http://tutorialgenius.blogspot.com/2012/02/unixlinux-setting-up-public-key.html

  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    939 引用 • 940 回帖
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    53 引用 • 37 回帖
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    238 引用 • 224 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...