局域网中发现带指定主机名证书的HTTPS服务器的优化方案及Nmap输出解析改进咨询
局域网中发现带指定主机名证书的HTTPS服务器的优化方案及Nmap输出解析改进咨询
嗨,我来帮你梳理下这个问题的解决方案和优化思路~
一、更优的设备发现替代方案
你提到的mDNS/DNS-SD(比如Avahi)确实比SSDP/UPnP更适合这个场景,这里再补充几个可选方向,根据你的需求选:
- mDNS/DNS-SD(Avahi):这是最推荐的方案,轻量且安全。每个设备可以通过Avahi注册自己的HTTPS服务,还能附加自定义元数据(比如证书的CN信息)。其他设备只需通过
avahi-browse命令或Avahi API查询对应服务类型,不用扫整个网段,既安静又高效,完全避免了Nmap扫描的“侵入感”。 - 自定义UDP多播方案:如果不想依赖第三方工具,可以自己实现简单的UDP多播逻辑——设备启动时主动发送包含自身IP、证书CN的多播包,其他设备监听这个多播地址即可。这种方案更轻量,但需要自己处理丢包、重复消息等细节。
- 集中式注册服务:如果局域网内有可以作为中心节点的设备,让每个设备上线时主动向中心节点注册自己的IP和证书信息,其他设备直接查询中心节点获取列表。这个方案适合设备数量较多的场景,但依赖中心节点的可用性。
二、Nmap输出解析的优化方案
你当前用grep+awk的组合确实比较脆弱,因为Nmap的输出格式可能随版本变化。这里提供两种更可靠的改进思路:
1. 用Python解析Nmap XML输出(最健壮)
Nmap支持输出XML格式(-oX -表示输出到标准输出),用Python解析XML结构会比文本匹配稳定得多,示例脚本如下:
import subprocess import xml.etree.ElementTree as ET import json TARGET = "192.168.1.30-100" PORT = 443 HOSTNAME = "www.example.com" DESIRED_CN = "*.example.com" # 执行Nmap命令并获取XML输出 nmap_cmd = [ "nmap", "-p", str(PORT), "--script", "ssl-cert", "--script-args", f"tls.servername={HOSTNAME}", "-oX", "-", TARGET ] result = subprocess.run(nmap_cmd, capture_output=True, text=True) root = ET.fromstring(result.stdout) peers = [] for host in root.findall("host"): current_ip = host.find("address").attrib["addr"] # 遍历ssl-cert脚本的输出内容 for script in host.findall(".//script[@id='ssl-cert']"): output_text = script.find("output").text if f"commonName={DESIRED_CN}" in output_text: peers.append(current_ip) # 输出标准JSON数组 print(json.dumps(peers))
2. 改进Shell脚本(更简洁可靠)
如果坚持用Shell实现,可以用awk直接跟踪当前IP并匹配证书信息,再用jq规范生成JSON,避免多次grep的脆弱性:
#!/bin/bash NMAP="/usr/bin/nmap" HOSTNAME="www.example.com" TCP_PORT_FOR_HTTPS=443 DESIRED_COMMON_NAME="*.example.com" TARGET="192.168.1.30-100" $NMAP -p $TCP_PORT_FOR_HTTPS --script ssl-cert --script-args=tls.servername=$HOSTNAME $TARGET | awk -v cn="$DESIRED_COMMON_NAME" ' # 记录当前扫描的IP /Nmap scan report for/ { current_ip = $NF } # 匹配目标证书CN,符合则输出IP /ssl-cert: Subject: commonName=/ { if ($0 ~ cn) { print current_ip } } ' | jq -R . | jq -s .
注:需要提前安装jq(sudo apt install jq),它能帮你规范生成JSON数组,比手动拼接更不易出错。
另外你提到的-oG确实会丢弃脚本输出,所以不适合用来解析证书信息,XML或直接处理原始输出是更优选择。
备注:内容来源于stack exchange,提问作者jacobq
相关产品推荐
相关产品推荐

