如何在不使用NMAP的情况下从客户端检测SSH主机的可用加密套件及算法并验证配置禁用效果
当然有办法啦!我自己每次调整完SSH配置后,都会用这些原生工具来验证禁用效果,完全不需要NMAP。下面给你分享几个实用的方法:
方法一:直接指定单个算法/加密套件测试
这是最直接验证某类算法是否被禁用的方式,用OpenSSH自带的ssh命令就能完成:
测试加密套件(Cipher):比如你想验证
aes128-cbc是否被禁用,直接执行:ssh -c aes128-cbc your-username@your-server-ip如果返回类似
no matching cipher found: client aes128-cbc server [列出的可用套件]的错误,就说明这个套件已经被成功禁用了;如果能正常连接,说明它还在启用列表里。测试密钥交换算法(Kex):对应参数是
KexAlgorithms,比如测试diffie-hellman-group1-sha1:ssh -o KexAlgorithms=diffie-hellman-group1-sha1 your-username@your-server-ip测试MAC算法:对应参数是
MACs,比如测试hmac-md5:ssh -o MACs=hmac-md5 your-username@your-server-ip测试主机密钥算法:对应参数是
HostKeyAlgorithms,比如测试ssh-dss:ssh -o HostKeyAlgorithms=ssh-dss your-username@your-server-ip
方法二:用Verbose模式查看协商细节
如果想看看当前连接实际用了哪些算法(或者服务器支持哪些协商成功的算法),可以用-v(或者-vv更详细)参数启动SSH:
ssh -v your-username@your-server-ip
在输出日志里,你可以找到类似这些行,它们会显示协商成功的算法:
debug1: kex: algorithm: curve25519-sha256@libssh.org
debug1: kex: host key algorithm: ssh-ed25519
debug1: kex: server->client cipher: chacha20-poly1305@openssh.com MAC:compression: none
debug1: kex: client->server cipher: chacha20-poly1305@openssh.com MAC:compression: none
你可以把这些结果和你禁用的算法列表对比,确认那些要禁用的没有出现在这里。
方法三:批量测试所有支持的算法
如果想一次性验证所有客户端支持的算法状态,可以写个简单的Shell脚本批量测试。比如下面这个脚本可以批量检测加密套件:
#!/bin/bash SERVER="your-server-ip" USER="your-username" echo "Testing all supported SSH ciphers for $SERVER:" echo "--------------------------------------------" for cipher in $(ssh -Q cipher); do echo -n "Testing $cipher: " # 用5秒超时,避免卡住 ssh -o ConnectTimeout=5 -c "$cipher" $USER@$SERVER exit 2>/dev/null if [ $? -eq 0 ]; then echo "✓ Enabled" else echo "✗ Disabled" fi done
把脚本里的SERVER和USER换成你的实际信息,运行后就能看到每个加密套件的启用状态,非常高效。
同理,你也可以把ssh -Q cipher换成ssh -Q kex、ssh -Q mac或者ssh -Q hostkey,来批量测试其他类型的算法。
方法四:用ssh-keyscan检测主机密钥算法
如果你只关注主机密钥算法的禁用情况,可以用ssh-keyscan工具,它能快速获取服务器支持的主机密钥:
ssh-keyscan -t rsa,ecdsa,ed25519,ssh-dss your-server-ip
如果某个类型的密钥没有返回结果,说明对应的主机密钥算法已经被禁用了。
备注:内容来源于stack exchange,提问作者Rick Brian




