ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Burp Suite CA证书安装与HTTPS抓包信任排查指南

Burp Suite CA证书安装与HTTPS抓包信任排查指南 刚把 Burp Suite 装好浏览器也指到了 8080结果打开目标站点一看HTTP History 里刷出来一排 CONNECT点开哪一条都是空的换个页面干脆整页红色警告您的连接不是私密连接。很多人第一反应是端口填错了、插件冲突了、版本不对了来回折腾两小时其实九成的情况只有一个原因Burp Suite 的 CA 证书没装或者装到了错误的存储区。这篇就把 CA 证书从哪下载、下成什么格式、装到哪个位置、装完之后怎么验证、安卓端为什么装了用户证书还是抓不到以及装完还报错时怎么一步步排查全部捋一遍。不管你是刚接触抓包的新手还是已经用了一段时间但一直靠重装试试解决问题的老用户这篇里的路径和坑基本都能对上号。1. 打开 Burp Suite 却看不懂 HTTPSCA 证书到底卡在哪一环1.1 HTTP History 里只剩 CONNECT问题出在信任链HTTPS 的流量在客户端和目标站点之间是加密的。Burp Suite 起的是一个本地监听服务客户端把请求发到它这里它再往目标站点转发。为了让中间这一段看得见Burp 会用自己的根证书针对你访问的每一个域名现场签发一张叶证书然后把这张叶证书交给客户端。客户端拿到叶证书之后不会直接信它会顺着证书链往上找签发者一直找到那张根证书为止再拿这张根证书去本地受信任的根证书颁发机构这个名单里核对。核不上验证就失败浏览器要么直接掐断连接给出警告页要么在部分场景下悄悄降级。所以整个问题的核心不是端口、不是型号、不是版本而是那张根证书有没有被客户端认下来。这就是为什么下载 CA 证书 导入并设置为信任是抓 HTTPS 绕不开的第一步。1.2 Burp Suite 的 CA 是第一次启动时现场生成的这一点要先讲清楚否则后面很多现象解释不通Burp Suite 的 CA 证书不是程序内置的一张固定证书而是首次运行时随机生成的一张自签根证书默认 RSA 2048 位新版可以在设置里调成 4096 位有效期也是可配置的证书和对应的私钥一起保存在当前用户的配置目录下。这意味着几个很实际的后果。第一换一台电脑、重装一次系统、清理一次配置目录证书就变了浏览器里那张旧的立刻失效。第二团队里每个人手里的证书都不一样别指望拿同事导出的证书文件在自己机器上能用——能导入但私钥对不上签出来的叶证书依然是坏的。第三很多人遇到昨天还好好的今天突然报错八成就是动了配置目录或者换了运行环境。提示证书文件和私钥文件是一对导出时只导证书DER 或 PEM不要连私钥一起到处传。私钥泄露等于任何人都能签出被你信任的证书。1.3 三种典型症状对照表先对症再动手能省掉大量无效尝试。下面这张表是我自己排错时最常用的第一张表现象直接原因处理方向浏览器整页红色警告您的连接不是私密连接根证书不在客户端的受信任根证书库导入证书到受信任的根证书颁发机构HTTP History 里只有 CONNECT点开没有明文TLS 握手未建立可解密通道先解决信任问题再回来看流量部分站点正常、部分站点报错该站点启用了证书锁定或双向认证属于应用层策略单独评估手机 App 白屏、提示网络异常应用只信任系统证书库不认用户证书区装到系统证书目录或改用调试构建命令行工具正常、浏览器报错两边的信任库不是同一个分别给工具自己配证书1.4 动手之前先把授权边界划清这件事必须放在前面说。CA 证书一旦被信任客户端到目标站点之间原本加密的内容在本地就是可见的明文这个能力是双刃剑。只对自己拥有、或者拿到了明确书面授权的系统做测试这是底线不是客套话。另外有个很实际的操作习惯不要在日常办公的电脑上长期挂着这张根证书。测试机上装完用完测完就移除系统级的受信任根证书尤其如此因为它影响的是整台机器上所有程序。我个人习惯是浏览器层面优先Firefox 独立证书库系统层面只在需要抓桌面客户端流量时临时装、用完删。2. 把 CA 证书取到手三条下载路径与格式选择2.1 直接访问内置页面下载这是最快的路子Burp Suite 在监听端口上同时挂了一个内置网页。浏览器里访问http://burp或者直接访问http://127.0.0.1:8080页面右上角会有一个 CA Certificate 的链接点一下就能把证书文件下下来文件名通常是cacert.der。这条路径之所以要单独拎出来讲是因为它有个隐藏前提你得先能打开这个页面。如果浏览器此时已经指向了 Burp 的监听端口而这个端口上的页面是明文 HTTP一般没问题但如果之前装过别的证书、或者网络设置里还留着旧配置就可能打不开。第一次下载我建议用 Firefox。原因很简单Firefox 用的是自己独立的证书库跟系统证书库互不干扰即使系统里干干净净什么都没装它也能正常打开http://burp这个页面把证书下下来。用系统证书库的浏览器在极端情况下反而容易卡住。2.2 从设置面板导出可以指定想要的格式如果内置页面打不开或者你需要的是 DER 之外的格式就直接从界面里导出。新版 Burp Suite 的设置面板左上角有一个搜索框直接输入 CA 或 certificate就能定位到证书导入导出的入口不用一层层翻菜单。老版本的入口在拦截模块的 Options 子页里找 Import / export CA certificate 这组按钮。导出时界面通常会给你两个选项一是导出证书文件可选 DER 格式二是导出证书加私钥的 PKCS#12 格式。给各种客户端做信任导入选前者就够了PKCS#12 里带着私钥那个是给需要充当签发者角色的场景用的日常抓包完全不必碰。2.3 直接从磁盘上把生成的文件挖出来做批量部署、写自动化脚本、或者要在容器里跑的时候走界面点鼠标就太慢了。证书其实就躺在配置目录里直接拷贝即可系统配置目录常见文件名Windows%APPDATA%\BurpSuite\即C:\Users\用户名\AppData\Roaming\BurpSuite\cacert.dermacOS~/Library/Application Support/BurpSuite/cacert.derLinux~/.BurpSuite/cacert.der需要留意的是不同版本的文件名和目录结构略有差别有些版本会把证书放在更深一层的子目录里。找不到的时候在配置目录下按修改时间排序看一眼就行首次运行生成的那个文件时间戳很明显。2.4 DER、PEM、CER、P12 到底选哪个这是新手最容易糊的地方拿到一个文件导入时报格式不支持然后开始怀疑人生。其实区分很简单格式常见扩展名内容适用场景DER.der.cer二进制编码的单张证书Windows 导入、安卓系统证书需转 PEM 后算哈希PEM.pem.crt.cerBase64 文本编码的单张证书各类命令行工具、Node、Python、curlPKCS#12.p12.pfx证书 私钥可带密码需要充当签发者身份的场景JKS.jksJava 专属密钥库格式Java 应用通常用 keytool 单独导入转换全靠 openssl两条命令就够用# DER 转 PEM openssl x509 -inform DER -in cacert.der -out cacert.pem # PEM 转 DER openssl x509 -inform PEM -in cacert.pem -outform DER -out cacert.der # 看一眼证书内容确认没转错 openssl x509 -in cacert.pem -noout -subject -issuer -dates最后那条查看命令建议养成习惯。导入之前先看一眼 subject 和 issuer 是不是同一张自签证书的这两个字段通常一致日期范围是否正常能避免一大半导进去了但没生效的乌龙。3. 桌面端导入Firefox、Chrome 与系统证书库的分工3.1 为什么建议先用 Firefox 验证整条链路Firefox 有自己独立的证书库导入和移除都不影响系统出问题也好回退。所以我的习惯是先在 Firefox 里把证书装好确认能抓到明文再去处理系统层面的证书库。这样万一失败能快速判断是证书本身的问题还是系统层面的问题。具体路径是设置 → 隐私与安全 → 往下拉到证书区域 → 查看证书 → 切到证书颁发机构标签 → 导入 → 选中刚才下下来的cacert.der→ 在弹出的对话框里勾选信任此 CA 以标识网站→ 确定。那个勾选框是关键。只导入不勾信任证书是躺进去了但 Firefox 不把它当回事抓包依然是空的。这一点每年都能劝退一批人。3.2 Chrome 和 Edge 走的是操作系统证书库这两个浏览器不维护自己的证书库它们直接读操作系统的受信任根证书列表。所以结论很直接不需要给 Chrome 单独装证书只要系统层面装好了它就生效。反过来说如果你只在 Firefox 里装了证书Chrome 依旧会报错这不是 Chrome 有问题。这也解释了一个常见困惑为什么同一台机器上 Firefox 能抓、Chrome 不能。答案就是两边信任库不同一个都没错。3.3 Windows 导入的完整步骤与两个必看勾选图形界面的走法Win R输入certmgr.msc回车 → 左侧展开受信任的根证书颁发机构 → 点开证书 → 右键空白处 → 所有任务 → 导入 → 下一步 → 选择cacert.der→ 下一步 →选择将所有的证书都放入下列存储→ 点浏览选受信任的根证书颁发机构 → 下一步 → 完成 → 弹出安全警告时点是。两个必看的地方一是所有的证书都放入下列存储这一项必须手动指定到受信任的根用默认的自动选择Windows 经常会把它丢到个人或者中间证书颁发机构去装完照样报错二是最后那个安全警告那是系统在提醒你这张根证书一旦被信任它可以签发任意域名的证书确认来源是你自己的 Burp 之后再点。命令行更快省掉一堆点击# 以管理员身份运行 certutil -addstore -f ROOT cacert.der # 查看是否导入成功 certutil -store ROOT | findstr /i burp3.4 macOS 钥匙串导入只是第一步还得始终信任macOS 上双击cacert.der钥匙串访问会自动打开并提示添加到哪个钥匙串选系统。这里有个坑导入完成不等于信任完成。你还得在钥匙串访问里找到刚导入的那张证书双击打开展开信任一栏把使用此证书时从使用系统默认改成始终信任然后关闭窗口系统会要求输入管理员密码解锁。只导入不设置信任是所有平台上都会犯的同一个错误只是 macOS 上它藏得更深一点。命令行版本sudo security add-trusted-cert -d -r trustRoot \ -k /Library/Keychains/System.keychain cacert.pem3.5 装完怎么确认真的生效了别凭感觉用两个动作确认第一个动作在抓包状态下访问任意一个 HTTPS 站点回到 HTTP History 里看能不能看到完整的请求方法、路径、请求头和响应体。能看到明文说明链路是通的。第二个动作在浏览器地址栏点那个锁形图标查看证书详情看签发者是谁。如果是 Burp 那张 CA 的名字说明当前这条连接确实是被 Burp 签发的叶证书接管了如果签发者还是站点原本的证书机构说明这段流量根本没经过 Burp要去检查网络设置。两个动作都通过桌面端的部分就算完成了。剩下一个很实用的小习惯把导出的cacert.pem和cacert.der放到一个固定目录比如~/certs/命名统一。后面要给 Java、Node、Python、curl 配信任时都要用随手能拿到。4. 安卓端为什么用户证书区装了还是抓不到4.1 Android 7.0 之后的信任策略变化是最大的分水岭手机端的操作比桌面端多一步关键认知从 Android 7.0API 24开始应用默认只信任系统证书库不信任用户证书区——除非应用在自己的网络安全配置里显式声明了要信任用户证书。所以会出现一个非常经典的现象你在设置 → 安全 → 加密与凭据 → 安装证书 → CA 证书里明明装成功了浏览器访问网站也正常了但目标 App 一打开还是网络异常。不是证书装错了是这个 App 压根不看用户证书区。处理思路只有两条要么把证书放进系统证书目录要么对应用本身的调试构建做配置。前者需要设备具备可写系统分区的条件只适合自己的测试设备后者只适用于你自己能改源码的应用。对不属于自己的应用做证书校验绕过不在讨论范围内。4.2 导出时选对格式别拿 DER 直接改名把证书放进系统证书目录不是简单地把.der拷过去就行文件名和格式都有讲究。完整流程如下# 1. 拿到 Burp 导出的 cacert.der先转成 PEM openssl x509 -inform DER -in cacert.der -out cacert.pem # 2. 计算 subject hashAndroid 用的是 old 版本算法 openssl x509 -inform PEM -subject_hash_old -in cacert.pem | head -n 1 # 输出类似9a5ba575 # 3. 按哈希值重命名扩展名固定为 .0 cp cacert.pem 9a5ba575.0这里有个高频坑网上很多教程写的是-subject_hash不加_old。新版 openssl 默认算出的是新式哈希名字对不上文件放进去了系统也不会加载。一定要用-subject_hash_old。4.3 把文件放进系统证书目录目标目录是/system/etc/security/cacerts/文件权限必须是644属主root:root文件名就是刚才那个哈希值.0。在可写系统分区的模拟器或调试设备上操作大致是adb root adb remount adb push 9a5ba575.0 /system/etc/security/cacerts/ adb shell chmod 644 /system/etc/security/cacerts/9a5ba575.0 adb reboot重启之后进设置 → 安全 → 加密与凭据 → 信任的凭据 → 系统能在这份列表里找到 Burp 那张证书就说明加载成功了。需要提醒的是绝大多数零售手机的系统分区是只读并且做了完整性校验的上面这套命令跑不通是正常现象。能在系统证书目录里做操作的前提是设备本身允许这么做比如调试用的模拟器、开发板、或者你完全掌控的测试机。这类操作只在自己的测试设备上做别拿主力机冒险。4.4 手机端的网络拦截设置与三个必查项证书搞定之后手机上还得让流量真的走到 Burp 这边来。在 Wi-Fi 的高级设置里把 IP 设置改成静态或手动找到网络配置项把主机名填成电脑的内网 IP端口填 8080。这一段落里最容易翻车的是三件事电脑和手机必须在同一个网段。手机连的是 5G 流量、电脑连的是公司 Wi-Fi这种组合是走不通的。Burp 的监听必须绑定到所有网络接口不能只绑在本地回环上。只绑回环的话本机浏览器能用手机一定连不上。Windows 防火墙要放行 8080 入站。这个坑我踩过不止一次手机设置全对电脑上抓包界面一动不动。关掉防火墙立刻就好说明就是入站规则没放行加一条针对 8080 的入站允许规则即可比直接关防火墙安全得多。排查顺序建议是先在手机浏览器访问一下http://电脑IP:8080能看到 Burp 的欢迎页说明网络通打不开就先查上面三条别急着怀疑证书。4.5 证书锁定SSL Pinning遇到之后怎么办有些应用会把预期证书或者公钥写死在代码或配置里任何替换都会导致校验失败这就是证书锁定。表现是浏览器能抓到明文这个 App 就是死活连不上。对自己开发的应用正当的处理方式是在调试构建里通过网络安全的调试配置声明信任额外的证书或者只在 debug 变体里关闭校验逻辑release 版本保持开启。这样既能调试又不会把风险带到线上。至于别人的应用不碰。这条线划清楚既是合规要求也是对自己职业生涯的保护。5. 装完还报错的排查链路从证书不受信任到时间不同步5.1 此 CA 根目录证书不受信任要启用信任请将该证书安装到...这条提示怎么读这条提示信息在 Windows 环境下出现频率极高很多人看到就懵。它其实说得很直白这张证书现在的存放位置不是一个会被信任的位置。通常有两种情况一是证书被放进了中间证书颁发机构或个人区二是证书链本身不完整只有叶证书没有根证书。处理办法就是把证书从当前位置删掉重新导入到受信任的根证书颁发机构。在certmgr.msc里对着证书右键看它现在躺在哪个节点下一目了然。5.2 装错存储区是最常见的低级错误我统计过自己踩过的坑这一类占了差不多一半。对照表如下错误存储区表现正确做法个人证书能在列表里看到但连接依旧报错移到受信任的根证书颁发机构中间证书颁发机构同上且可能出现证书不受信任提示同上根证书不该放这里受信任的发布者看起来已信任但不参与 TLS 校验移回根证书区用户存储 vs 计算机存储当前用户能用服务类程序用不了需要时导入到本地计算机存储最后一行值得单独说。当前用户和本地计算机是两个独立的存储区用certmgr.msc打开的是当前用户用certlm.msc打开的是本地计算机。给桌面客户端、后台服务、或者以系统账户运行的程序抓包时证书得装到本地计算机那一侧。5.3 系统时间不同步导致证书未生效或已过期证书上有两个时间字段生效时间和失效时间。客户端本地时间只要跟真实时间有偏差就可能出现证书尚未生效或者证书已过期的报错而且这类报错特别有迷惑性因为证书本身完全没问题。高发场景是虚拟机、装了双系统的机器、以及长时间关机后电池没电的老设备。排查方式就是打开系统时间设置看是不是自动同步手动同步一次再试。5.4 浏览器缓存、HSTS 与 HTTP/3 这几个容易被忽略的干扰项有时候证书明明装对了浏览器就是不给面子原因可能是这几个HSTS某些站点之前被访问过浏览器把它记进了强制走 HTTPS 的名单并且缓存了状态。清除方式是访问chrome://net-internals/#hsts在底部把该域名删掉。连接复用浏览器会把已经建立的连接保持一段时间。证书装完之后把浏览器完全退出再重开比按刷新键管用。HTTP/3QUIC基于 UDP 的新一代协议部分情况下抓包工具看不到这部分流量。如果发现某些站点时快时慢地漏流量可以在浏览器的实验性功能里把 QUIC 关掉试试或者针对性地确认抓包工具当前版本是否支持。这些都是证书没问题但结果不对的典型情况排查时容易被忽略因为大家默认问题一定在证书上。5.5 命令行和脚本有它们自己的信任库最后一个大坑系统证书装好了不代表命令行工具就认。curl、Python、Node、Java 各有各的信任库需要分别配置。这张表建议存下来工具配置方式示例curl命令行参数或环境变量curl --cacert cacert.pem https://目标Python requests参数或环境变量requests.get(url, verifycacert.pem)Node.js环境变量NODE_EXTRA_CA_CERTS/path/cacert.pemJavakeytool 导入到 cacerts见下方命令Git配置项git config --global http.sslCAInfo /path/cacert.pemJava 那个单独写一下因为它是独立密钥库跟系统的完全无关# 先确认 JAVA_HOME 指向哪个 JDK echo $JAVA_HOME # 导入默认口令 changeit keytool -importcert -alias burpca -trustcacerts \ -keystore $JAVA_HOME/lib/security/cacerts \ -file cacert.pem环境变量版的写法适合写进终端的启动脚本里一次性生效export REQUESTS_CA_BUNDLE/path/cacert.pem export CURL_CA_BUNDLE/path/cacert.pem export NODE_EXTRA_CA_CERTS/path/cacert.pem5.6 证书换了一份所有地方都得重来一遍前面提过Burp 的 CA 是首次运行时生成的配置目录一旦被清理或者换了机器证书就换了一份之前所有导入的地方全部失效。这件事没有捷径只能重走一遍流程。我的处理方式是把它脚本化把所有导出和导入命令写进一个 shell 脚本换环境之后跑一次就完事。脚本里包含三件事——从配置目录拷出证书、转成 PEM/DER 两份、按平台分别导入系统证书库和工具链。这样重装系统或者换新机器时五分钟就能恢复常用环境比手动点一遍菜单快得多。有个细节要记住这个脚本所在的目录只放证书不放私钥也别把这个目录提交到任何代码仓库。证书本身是公开信息但一旦哪天顺手把私钥文件也拷进去了那就是另一回事了。我自己是在目录下放了一个.gitignore和一些说明文字隔一段时间回头看也知道这张证书是哪台机器、什么时候导出来的。最后补一个我自己的经验装证书这件事麻烦的从来不是那几步点击而是装了一半的状态——系统装了浏览器没认、Firefox 装了 Chrome 没认、手机用户区装了应用不认、系统装好了 curl 不认。所以每装完一层就用第 3.5 节那两个动作验证一次确认这一层真的通了再往下走。一层一层确认比最后一次性排查要省心得多。
返回列表