可以使用SSH协议进行远程管理通道安全保护,其中涉及的主要安全功能包括主机验证、数据加密性和数据完整性保护。
这里要注意的是【主机验证】和【身份验证】的区别,主机验证是客户端确认所访问的服务端是目标访问对象,比如从从客户端A(192.168.3.1)连接到服务端B(192.168.3.133)上,需要验证服务端B是真实的。当主机验证通过后,主机验证通过后,将进入身份验证阶段。SSH支持多种身份验证机制,它们的验证顺序如下:gssapi-with-mic,hostbased,publickey,keyboard-interactive,password,但常见的是密码认证机制(password)和公钥认证机制(public key)。
SSH客户端若是首次登录或者例如在windows注册表中删除【计算机\HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys】中对应服务器端host key值。(例如Putty)使用ssh登录服务器,会弹出如下提示:
The host key is not cached for this server:
192.168.3.133 (port 22)
You have no guarantee that the server is the computer you think it is.
The server's ssh-ed25519 key fingerprint is:
ssh-ed25519 255 SHA256:gFoFqs17V915WdaNspPRsCPu8g9McWt5Hduo6RLhK5I
If you trust this host, press "Accept" to add the key to PuTTY's cache and carry on connecting.
If you want to carry on connecting just once, without adding the key to the cache, press "Connect Once".
If you do not trust this host, press "Cancel" to abandon the connection.
打开more info可以看到
Full text of host’s public key
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAxMDpul0HDFVD4NAYw8rk0Ex1bDGsqWCDALE0FBzajw
SHA256 fingerprint gFoFqs17V915WdaNspPRsCPu8g9McWt5Hduo6RLhK5I
MD5 fingerprint 13:9d:92:62:1a:ca:7e:77:f7:ab:89:2e:f3:a0:1f:20
点击accept,在windows注册表中就会新增一个条目,数据值为
0x6e326c40573f5fffb8224daceab4ac24050a609ff50ce518e4a27cadc52a848d,0x70a8cd4141130b300896ca1ac356c7044dae3c8c010d3e54c570d0a59b0e4c0c
后续,在客户端将不再出现之前的提示,而是获得到从服务端B发来的公钥后与保持在本地的的公钥指纹进行比对,如果一致则验证成功。
此时,我们可以看下公钥及公钥指纹的对应关系,具体如下:
Base64编码服务端公钥(在客户端的提示窗口中可以找到,或者在服务端/etc/ssh目录中)
AAAAC3NzaC1lZDI1NTE5AAAAIAxMDpul0HDFVD4NAYw8rk0Ex1bDGsqWCDALE0FBzajw
对应HEX编码服务端公钥(base64 to hex)
0000000B7373682D65643235353139000000200C4C0E9BA5D070C5543E0D018C3CAE4D04C756C31ACA9608300B134141CDA8F0
对服务端公钥做SHA256 hash计算得到
805A05AACD7B57DD7959D68DB293D1B023EEF20F4C716B791DDBA8E912E12B92
转base64得到gFoFqs17V915WdaNspPRsCPu8g9McWt5Hduo6RLhK5I=,与putty窗口提示的SHA256公钥指纹一致。
对服务端公钥做MD5 hash计算得到139D92621ACA7E77F7AB892EF3A01F20,与putty窗口提示的MD5公钥指纹一致。
最后,通过抓包来看下服务端B的公钥是在哪条消息发功给客户端的,具体抓包信息如下。
在wireshark中查找0C4C十六进制数值,查找到在server发出的Key Exchange Reply消息中。可以看到EdDSA public key字段中的内容与HEX编码的公钥信息标黄部分完全一致,所以服务端公钥就是在此消息中完成发送给客户端的。
那么【0000000B7373682D6564323535313900000020】这部分是什么呢?把HEX转为ASCII码就是ssh-ed25519,也就是公私密钥对的生成算法。