能否在插件中检测MITM证书是否已安装?
mitmproxy插件证书检测与重定向实现方案
目前官方文档没有提供直接检测MITM证书安装状态的封装接口,但可以通过监听TLS握手事件的方式间接实现该需求,具体方案如下:
- 客户端未安装MITM根证书时,发起HTTPS请求的TLS握手阶段会触发证书验证失败,mitmproxy会抛出
tls_handshake_failed事件,可在自定义插件中监听该事件捕获这类异常请求。 - 过滤掉非证书原因导致的TLS握手失败,匹配错误信息中的
CERTIFICATE_VERIFY_FAILED特征字段,即可判定为客户端未安装MITM证书的场景。 - 捕获到对应请求后构造302重定向响应,重定向地址填写
http://mitm.it即可,注意必须使用HTTP协议的重定向地址,避免HTTPS场景下再次触发证书验证失败导致重定向不生效。
你可以参考以下核心代码实现:
from mitmproxy import tls, http class CertDetectionRedirect: def tls_handshake_failed(self, flow: tls.TLSFlow) -> None: # 匹配证书验证失败场景 if "CERTIFICATE_VERIFY_FAILED" in str(flow.error): # 清除原错误,构造重定向响应 flow.error = None flow.response = http.HTTPResponse.make( 302, {"Location": "http://mitm.it"}, b"" ) addons = [CertDetectionRedirect()]
补充说明:如果用户首次访问的是HTTP站点,不会触发TLS握手失败,你可以额外在HTTP请求的处理逻辑中增加状态标记校验,未检测到已安装标记的请求统一触发重定向即可。
内容的提问来源于stack exchange,提问作者mama
相关产品推荐
相关产品推荐

