转自:https://marskid.net/2018/02/05/how-to-verify-ssh-public-key-fingerprint/

使用SSH进行远程连接新的主机的时候,经常会看到一个提示:

$ ssh 127.0.0.1
The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:QUfCwW6Br5EwwESsulN2TEidBoDNca888RNflZG++bI.
Are you sure you want to continue connecting (yes/no)? yes

如果输入yes确认,那么服务器SSH公钥会添加到~/.ssh/known_hosts里面。虽然知道这是一个验证步骤,但是应该怎样验证?其中原理又是什么?

$ cat ~/.ssh/known_hosts
|1|DdBYclZ+pUHyoiLC2zjmf5Efb4Y=|fdd5RRy2SV0775av/4ktZr30aI8= ecdsa-sha2-nistp256 AAAAE2VjZHN.........K+/urI+pGmsSDz6O5PY=

第一次连接SSH有提示ECDSA类型的公钥指纹,因为指纹比公钥的长度要短,所以更容易比较。

SHA256:QUfCwW6Br5EwwESsulN2TEidBoDNca888RNflZG++bI

这个指纹也可以通过ssh-keyscan命令结合ssh-keygen得到。ssh-keyscan 命令可获取服务器公钥,而 ssh-keygen 命令可以计算公钥的指纹。只要计算一下服务器上的相应公钥的指纹,并与客户端获取的指纹进行比对一致,就能确定连接的是公钥对应的服务器。

先在客户端获取服务器公钥:

$ ssh-keyscan -t ECDSA -p 22 127.0.0.1
# 127.0.0.1:22 SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.4
127.0.0.1 ecdsa-sha2-nistp256 AAAAE2VjZHN.........K+/urI+pGmsSDz6O5PY=

可以看到这个公钥与写入known_hosts文件是一致的。

那么这个公钥从哪里来,怎么确认与服务器的连接是正确的?

可以通过ssh-keygen命令获取公钥的指纹,可通过-E参数指定指纹的类型。

$ ssh-keygen -E sha256 -lf ~/.ssh/known_hosts
256 SHA256:QUfCwW6Br5EwwESsulN2TEidBoDNca888RNflZG++bI |1|DdBYclZ+pUHyoiLC2zjmf5Efb4Y=|fdd5RRy2SV0775av/4ktZr30aI8= (ECDSA)

有的SSH终端默认提供MD5格式的公钥指纹。

$ ssh-keygen -E md5 -lf ~/.ssh/known_hosts
256 MD5:e6:f0:2b:fa:23:fb:fe:0d:1d:de:2c:71:70:ea:fe:f9 |1|DdBYclZ+pUHyoiLC2zjmf5Efb4Y=|fdd5RRy2SV0775av/4ktZr30aI8= (ECDSA)

这样就方便与服务器的指纹进行比较,虽然直接比较公钥是否相同也可以。

进入服务器,可看到/etc/ssh/目录下有几种密钥,这些文件在安装openssh-server后生成。SSH服务就是使用这些密钥与客户端进行加密通信。

$ ls -1 /etc/ssh/ssh_host*
/etc/ssh/ssh_host_dsa_key
/etc/ssh/ssh_host_dsa_key.pub
/etc/ssh/ssh_host_ecdsa_key
/etc/ssh/ssh_host_ecdsa_key.pub
/etc/ssh/ssh_host_ed25519_key
/etc/ssh/ssh_host_ed25519_key.pub
/etc/ssh/ssh_host_rsa_key
/etc/ssh/ssh_host_rsa_key.pub

根据终端的提示,选择ECDSA进行比较。可在服务器通过下面的命令生成服务器的公钥指纹摘要,这是可信的基础。

$ ssh-keygen -E sha256 -lf /etc/ssh/ssh_host_ecdsa_key.pub
256 SHA256:QUfCwW6Br5EwwESsulN2TEidBoDNca888RNflZG++bI root@localhost (ECDSA)

这是MD5格式。

$ ssh-keygen -E md5 -lf /etc/ssh/ssh_host_ecdsa_key.pub
256 MD5:e6:f0:2b:fa:23:fb:fe:0d:1d:de:2c:71:70:ea:fe:f9 root@localhost (ECDSA)

可以在客户端使用如下命令通过网络获取服务器的公钥指纹摘要。

$ ssh-keyscan -t ECDSA -p 22 127.0.0.1 2>/dev/null | ssh-keygen -E sha256 -lf -
256 SHA256:QUfCwW6Br5EwwESsulN2TEidBoDNca888RNflZG++bI 127.0.0.1 (ECDSA)

这是MD5格式。

$ ssh-keyscan -t ECDSA -p 22 127.0.0.1 2>/dev/null | ssh-keygen -E md5 -lf -
256 MD5:e6:f0:2b:fa:23:fb:fe:0d:1d:de:2c:71:70:ea:fe:f9 127.0.0.1 (ECDSA)

可以看到,在服务器上直接生成的

256 SHA256:QUfCwW6Br5EwwESsulN2TEidBoDNca888RNflZG++bI root@localhost (ECDSA)

与客户端获取的

256 SHA256:QUfCwW6Br5EwwESsulN2TEidBoDNca888RNflZG++bI 127.0.0.1 (ECDSA)

公钥指纹是一致的,并且~/.ssh/known_hosts文件中的对应主机的公钥也与服务器相应类型的公钥一致。可以据此判断SSH建立的连接是正确的。

 
 
 
 

验证远程主机SSH指纹的更多相关文章

  1. 【Hadoop系列】linux下 root用户免密码登录远程主机 ssh

    SSH原理:[Hadoop系列]linux SSH原理解析 操作环境: CentOS 6.5 操作对象: 用户A主机和远程主机B 正文部分:斜体加粗代表linux指令. linux下 非root用户免 ...

  2. 构建秘钥对验证的SSH体系

    构建秘钥对验证的SSH 体系 首先先要在ssh 客户端以root用户身份创建秘钥对 客户端将创建的公钥文件上传至ssh服务器 服务器将公钥信息导入用户root的公钥数据库文件 客户端以root用户身份 ...

  3. JGit与远程仓库链接使用的两种验证方式(ssh和https)

    JGit是使用JAVA的API来操控Git仓库的库,由Eclipse公司维护.他提供的API分成两个层次,底层命令和高层命令.底层API是直接作用于低级的仓库对象,高层的API是一个面向普通用户级别功 ...

  4. CentOS 配置远程主机ssh免密登录

    ssh针对的是用户不是机器,同一机器不同用户需要单独配置ssh,才能实现该用户的免密登录 cd ~ cd ./.ssh 在./ssh目录下生成公钥与私钥(如果没有.ssh先使用ssh命令连接到一台远程 ...

  5. 使用ssh连接远程主机

    在linux系统中,ssh是远程登录的默认工具,因为该工具的协议使用了RSA/DSA的加密算法.该工具做linux系统的远程管理是非常安全的. ssh登录远程主机(服务器)一般有两种方式:无密钥方式  ...

  6. Ansible批量更新远程主机用户密码 (包括Ansible批量做ssh互信)

    按照集团运维信息安全制度, 需要每个一段时间对线上服务器密码进行一次变更,通过shell脚本部署比较繁琐,所以决定采用ansible脚本对远程主机root密码进行批量重置,该脚本已经在稳定运行在正式环 ...

  7. Linux登录验证机制、SSH Bruteforce Login学习

    相关学习资料 http://files.cnblogs.com/LittleHann/linux%E4%B8%AD%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E8%AE% ...

  8. iOS - (个人隐私钱包调用系统本机TouchID指纹锁验证)

    // //  ViewController.m //  TouchID指纹验证 // //  Created by apple on 16/9/18. //  Copyright © 2016年 ap ...

  9. iOS 指纹解锁 验证TouchID

    iOS指纹解锁 1.首先,引入依赖框架 LocalAuthentication.framework #import <LocalAuthentication/LocalAuthenticatio ...

随机推荐

  1. TreeMap - 源代码学习笔记

    TreeMap 实现了 NavigableMap 接口,而NavigableMap 接口继承于 SortedMap接口. 所有本文还会记录 SortedMap 和 NavigableMap 的阅读笔记 ...

  2. 经典面试题sql基础篇-50常用的sql语句(有部分错误)

    Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 问题 ...

  3. 在JS文件中,不需要<script>标签

    在JS文件中,不需要<script>标签\

  4. PropertiesUtil 读取properties

    package com.midea.clean.util; import java.io.InputStream; import java.io.UnsupportedEncodingExceptio ...

  5. <YARN><MRv2><Spark on YARN>

    MRv1 VS MRv2 MRv1: - JobTracker: 资源管理 & 作业控制- 每个作业由一个JobInProgress控制,每个任务由一个TaskInProgress控制.由于每 ...

  6. orm的理解

    orm:是对象->关系->映射,的简称. mvc或者mvc框架中包括一个重要的部分,就是orm,它实现了数据模型于数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可 ...

  7. ipython output logging:使用日志记录输出

    通常使用ipython的%logstart日志功能时,仅开启输入的记录. 例如在ipython中开启%logstart后,记录的日志文件内容如下: #!/usr/bin/env python # 20 ...

  8. Spring Boot 揭秘与实战(二) 数据存储篇 - MyBatis整合

    文章目录 1. 环境依赖 2. 数据源3. 脚本初始化 2.1. 方案一 使用 Spring Boot 默认配置 2.2. 方案二 手动创建 4. MyBatis整合5. 总结 4.1. 方案一 通过 ...

  9. 2.24 js处理内嵌div滚动条

    2.24 js处理内嵌div滚动条 前言    前面有篇专门用js解决了浏览器滚动条的问题,生活总是多姿多彩,有的滚动条就在页面上,这时候又得仰仗js大哥来解决啦.一.内嵌滚动条    1.下面这张图 ...

  10. kafka definitive guide - reading notes

    一.认识Kafka 1)什么是sub/pub模型, 发布订阅模型   Publish/subscribe messaging is a pattern that is characterized by ...