非对称密钥算法诸如RSA、ECDSA等在证书管理方面有着广泛的应用,在使用的很频繁的ssh命令执行时首次就会用到,这篇文章将通过首次登录信息中密钥指纹信息的来龙去脉,说明证书公钥在ssh认证中的作用。
首次连接某台机器,可能会如下示例信息:
liumiaocn:~ liumiao$ ssh host121 The authenticity of host '[127.0.0.1]:21122 ([127.0.0.1]:21122)' can't be established. ECDSA key fingerprint is SHA256:y9ir2Jbc7kNZPhP9h/O9juUZbTmGDo6NZi2IZnLwg0s. Are you sure you want to continue connecting (yes/no)?
可以看到这是名为host121的机器,实际上是在127.0.0.1的本机上在21122进行的端口连接。上述提示的信息是说这台目标机器的SHA256密钥指纹是y9ir2Jbc7kNZPhP9h/O9juUZbTmGDo6NZi2IZnLwg0s,是否需要继续连接。根据操作系统的不同,有时也会同时显示SHA256和MD5方式的指纹信息,比如:
[root@host121 ssh]# ssh 192.168.163.121 The authenticity of host '192.168.163.121 (192.168.163.121)' can't be established. ECDSA key fingerprint is SHA256:y9ir2Jbc7kNZPhP9h/O9juUZbTmGDo6NZi2IZnLwg0s. ECDSA key fingerprint is MD5:d5:e7:dc:b3:21:06:5a:e5:c0:f7:a4:60:f7:59:d4:48. Are you sure you want to continue connecting (yes/no)?关于密钥指纹
密钥指纹实际上是非对称加密算法的公钥的应用,在这里它用来表示登录对象机器的身份,比如此处算法使用的是ECDSA,显示的指纹密钥实际上就是对使用ECDSA算法产生的公钥文件再次进行SHA256算法进行摘要,从而形成代表服务器身份的数字指纹,在登录的时候,向用户提示此指纹信息,表示和此机器建立连接,相当于要求用户对此证书信息进行确认。
确认流程和方式在实际的场景中此问题简单的多,如果碰到了类似的ssh的身份认证连接,担心是否真正连接到目标机器,一般目标机器的提供者应同时提供此指纹信息。这里以IP为192.168.163.121的虚拟机的ssh首次连接为例,说明上述指纹信息的来源
ECDSA的公钥信息前面提到过此提示信息实际上述ECDSA公钥的摘要内容,首先确认此公钥文件的内容信息,有如下两种方式可以进行确认:
- 方法1: 直接确认公钥文件内容 在机器安装的时候,缺省会在/etc/ssh目录下生成基于RSA、ECDSA等算法的公钥和私钥文件,直接使用cat命令显示文件内容即可
[root@host121 ssh]# pwd /etc/ssh [root@host121 ssh]# ls moduli sshd_config ssh_host_ecdsa_key.pub ssh_host_ed25519_key.pub ssh_host_rsa_key.pub ssh_config ssh_host_ecdsa_key ssh_host_ed25519_key ssh_host_rsa_key [root@host121 ssh]# cat ssh_host_ecdsa_key.pub ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEy3w5004yyzNA8dXo1vo67E63tZybV88SiDupDfnHzHCeZ4tHjNqdabc9Fa+Jwwe5uIjcUFb+Ag4HaBjK4982U= [root@host121 ssh]# cat ssh_host_rsa_key.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/pnteFxnI3Rk8OHVqJeIq83umem5/2VKjkZ7JJKi4wPJVYCrRBySPWdTs0V/T+sZdtF8LWmDw8yKuIYmb0yOm3d+3eFnQKVCtEcnP/Ctyuenha1o2PYzTv/4fjZX5Rf8SBXw6MbrHLE2ctjbhWrhQ6gbZ7C8fU82YS/EoWG2uk3XtRq0Ua6s5v9f1x3HV8PsDycrgQG99bw4Gr4dJ8u5a3MzpNtLS5Df7JlES683AoER1RHxmg+BP4zvXS2ePDhMr7gHi/fI35UMH78K/FJQu9oj46WUHkwWrOr2SbvKJLHy9GkDBLDj9EH8Tp4u+EVRqyH9Dsn1RJ9NOzxrEYtXl [root@host121 ssh]#
- 方法2: 使用ssh-keyscan命令 使用ssh-keyscan命令可以直接在客户端上获得相同信息:
liumiaocn:~ liumiao$ ssh-keyscan -t ECDSA -p 21122 127.0.0.1 # 127.0.0.1:21122 SSH-2.0-OpenSSH_7.4 [127.0.0.1]:21122 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEy3w5004yyzNA8dXo1vo67E63tZybV88SiDupDfnHzHCeZ4tHjNqdabc9Fa+Jwwe5uIjcUFb+Ag4HaBjK4982U= liumiaocn:~ liumiao$ ssh-keyscan -t RSA -p 21122 127.0.0.1 # 127.0.0.1:21122 SSH-2.0-OpenSSH_7.4 [127.0.0.1]:21122 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/pnteFxnI3Rk8OHVqJeIq83umem5/2VKjkZ7JJKi4wPJVYCrRBySPWdTs0V/T+sZdtF8LWmDw8yKuIYmb0yOm3d+3eFnQKVCtEcnP/Ctyuenha1o2PYzTv/4fjZX5Rf8SBXw6MbrHLE2ctjbhWrhQ6gbZ7C8fU82YS/EoWG2uk3XtRq0Ua6s5v9f1x3HV8PsDycrgQG99bw4Gr4dJ8u5a3MzpNtLS5Df7JlES683AoER1RHxmg+BP4zvXS2ePDhMr7gHi/fI35UMH78K/FJQu9oj46WUHkwWrOr2SbvKJLHy9GkDBLDj9EH8Tp4u+EVRqyH9Dsn1RJ9NOzxrEYtXl liumiaocn:~ liumiao$生成密钥指纹
使用如下命令即可根据公钥文件生成密钥指纹(摘要信息):
生成SHA256方式密钥指纹(ECDSA):ssh-keygen -E sha256 -lf /etc/ssh/ssh_host_ecdsa_key.pub
生成MD5方式密钥指纹(ECDSA):ssh-keygen -E md5 -lf /etc/ssh/ssh_host_ecdsa_key.pub
执行日志示例如下所示:
[root@host121 ssh]# ssh-keygen -E sha256 -lf /etc/ssh/ssh_host_ecdsa_key.pub 256 SHA256:y9ir2Jbc7kNZPhP9h/O9juUZbTmGDo6NZi2IZnLwg0s no comment (ECDSA) [root@host121 ssh]# ssh-keygen -E md5 -lf /etc/ssh/ssh_host_ecdsa_key.pub 256 MD5:d5:e7:dc:b3:21:06:5a:e5:c0:f7:a4:60:f7:59:d4:48 no comment (ECDSA) [root@host121 ssh]#
可以看到ssh首次连接时提示的密钥指纹信息了。
总结ssh首次连接时写到know_hosts中的密钥指纹信息的来源是对目标机器的公钥进行数字摘要算法而得出的,结合流程可以预防中间人攻击。