Java 证书漏洞(CVE-2026-91403)阻止列表方式临时应对工具 — Windows / macOS
查找 PC 上安装的所有 Java(Minecraft 启动器、模组启动器、开发工具、手动安装的 JDK), 检查是否已应用 OpenJDK 建议的临时措施(将 16 个问题证书添加到阻止列表)。 若用户同意,则添加缺失的条目。若选择,还会实际运行每个 Java,检查伪造证书是否真的被拒绝。
此工具并非完整的解决方案。 它不会更新 Java,不会修复信任存储(cacerts), 也不会开启证书吊销检查。根本的解决办法是将 Java 和启动器更新到修复后的版本。 详情请阅读 3. 此工具的局限性。
仅使用 Rust 标准库、不依赖任何外部库构建,因此只需阅读 src/ 和 probe/ 文件夹即可确认其全部工作内容。
English: see English below.
2026 年 10 月,有消息披露认证机构 eMudhra 的 8 个中间证书的私钥可被任何人获取。 加上由同一密钥交叉签名的 Sectigo "AAA Certificate Services" 证书,共计 16 个。
未修复的 Java 信任这些证书,因此当攻击者处于同一网络(如公共 Wi-Fi 等)时, 可以伪造冒充任意网站的假证书,而 Java 会将其当作真实证书接受。 例如,可以冒充 Minecraft 登录(会话)服务器或模组下载服务器。
OpenJDK 建议的措施为以下三种之一。
| 官方措施 | 此工具 |
|---|---|
| 将 Java 更新到修复版本(Oracle/OpenJDK 基准为 25.0.5.0.2、21.0.13.0.2、17.0.21.0.2、11.0.33.0.2、8u511 及以上) | ❌ 不执行(仅提示) |
通过 blocked.certs(Java 8 为 blacklisted.certs)阻止问题证书 | ✅ 添加 16 个 |
开启证书吊销检查(-Dcom.sun.net.ssl.checkRevocation=true -Dcom.sun.security.enableCRLDP=true) | ❌ 不执行(原因) |
参考资料
| 阶段 | 内容 | 互联网 |
|---|---|---|
| 文件检查 | 对找到的每个 Java 读取 lib/security/blocked.certs(Java 8 为 blacklisted.certs)和 release 文件,查看 16 个证书是否在阻止列表中。 | 不使用 |
| 实际连接检查(可选) | 实际运行每个 Java,尝试连接 2 个测试站点和 Mojang 会话服务器,确认伪装证书是否被拒绝。详情 | 仅此阶段使用 |
| 添加阻止列表 | 仅将缺失的证书指纹追加到文件末尾。不删除或修改现有行,并将原文件备份为 blocked.certs.bak-cve-2026-91403。添加后重新读取文件进行确认。 | 不使用 |
| 回滚 | 将备份复制回原位置。 | 不使用 |
Y 才能继续。其他任何输入均视为“否”。%LOCALAPPDATA%\JavaFix、macOS ~/Library/Logs/JavaFix 中记录检查了什么、更改了什么。cacerts)。 删除根证书可能会连正常网站也被阻止,因此不做改动。
(例如:Sectigo "AAA Certificate Services" 是许多正常网站使用的根证书。)请从 Releases 页面下载与操作系统匹配的文件。
| 操作系统 | 文件 |
|---|---|
| Windows(大多数 PC) | javafix-windows-x64.exe |
| Windows(ARM 笔记本) | javafix-windows-arm64.exe |
| macOS(Intel / Apple Silicon 通用) | javafix-macos-universal.zip |
要确认收到的文件是否为原始文件,请与 SHA256SUMS 中的值进行比较。
certutil -hashfile javafix-windows-x64.exe SHA256 (Windows)
shasum -a 256 javafix-macos-universal.zip (macOS)
Windows
javafix-windows-x64.exe。macOS
javafix-macos-universal.zip 并解压(Safari 会自动解压)。会生成 javafix-macos 文件夹。javafix.command,终端会打开并执行。javafix.command → 打开 → 打开。若要在终端中直接运行:
cd ~/Downloads/javafix-macos
xattr -d com.apple.quarantine javafix.command
./javafix.command
v0.1.0的未压缩javafix-macos-universal文件下载后会丢失执行权限,双击时文本编辑器会弹出“文本编码 Unicode(UTF-8) 不适用”的错误。从v0.1.1起改为以 zip 形式分发。
说明:显示漏洞说明、工具的作用、局限性、承诺(备份、回滚、互联网使用范围)以及记录文件位置。
菜单:1 检查并在需要时添加阻止列表 / 2 回滚 / 3 退出。
检查同意 → 文件检查:大约需要 1~3 分钟。对每个找到的 Java 显示状态、版本和位置。
实际连接检查同意(可选):按 Y 会运行每个 Java 以确认是否真的被阻止。若不是 Y 则跳过。
添加阻止列表说明:说明会改变什么、备份位置、影响范围以及根本解决方法。 如果有正在运行的 Java 程序,会提示“需要重新启动才能生效”。此工具不会终止程序。
添加阻止列表同意:必须输入 Y 才会添加。如果执行了第 4 步,会询问是否对添加的 Java 再次进行实际连接检查。
管理员权限同意(仅在需要时):位于 Program Files(Windows) 或 /Library 等系统文件夹(macOS)中的 Java
需要管理员权限才能修改。再次获得同意后
sudo 重新运行(输入登录密码)。重新运行的一侧也会从头开始说明,并在所有步骤中重新获得同意。
收尾:重新启动 Minecraft、启动器、IDE 等 Java 程序后即可生效。
文件检查
| 标记 | 含义 | 工具的操作 |
|---|---|---|
[已应用阻止列表] | 阻止列表中包含全部 16 项(但这并不代表仅此就完全安全) | 无 |
[无阻止列表] | 部分或全部缺失 | 同意后添加 |
[无阻止列表] (需要管理员权限) | 同上,但位于系统文件夹中 | 获得管理员权限同意后添加 |
[应用更新] | macOS 中位于已签名应用内的 Java | 不修改(会破坏应用签名)。请更新该应用。 |
[无法确认] | 阻止列表格式不同的文件 | 不修改。请更新该程序。 |
实际连接检查
| 标记 | 含义 |
|---|---|
安全 (拒绝伪装证书) | 两个测试站点均被拒绝,且能正常连接到 Mojang 会话服务器 |
脆弱 (信任伪装证书) | 任一测试站点被连接。需要添加阻止列表或更新 Java。 |
无法判断 (原因) | 无互联网连接、Java 过旧导致无法连接、无可执行文件、超时等 |
即使没有阻止列表,实际连接检查也可能显示为 安全。这是发行版通过移除有问题的根证书来修复的情况(例如:Temurin 25.0.5+8)。
反之,如果有阻止列表却显示为 脆弱,请务必更新该 Java。
这是为弥补仅查看文件的检查的局限性而设的可选步骤。
probe/JavafixProbe.java,可在 Java 8 及以上运行)解压到临时文件夹,并用找到的每个 Java 分别执行。检查结束后删除临时文件夹。dv-g3b-emudhra.we-have-a-problem.com:eMudhra 路径的伪装证书 → 应当被拒绝才算正常dv-g3b-aaa-emudhra.we-have-a-problem.com:Sectigo AAA 路径的伪装证书 → 应当被拒绝才算正常sessionserver.mojang.com:用于对比 → 应当能连接才算正常(若无法连接,则视为网络问题,判定为无法判断)HEAD 请求),不发送任何信息。排除 JAVA_TOOL_OPTIONS 等环境变量,使用各 Java 的默认设置进行检查。在菜单中选择 2 或以 --restore 运行。仅显示存在本工具创建的备份(*.bak-cve-2026-91403)的 Java,
经同意后将备份复制回原文件位置,然后删除备份文件。还原后 16 个证书将重新被信任,因此
建议仅在更新 Java 之后再进行还原。
javafix 대화형 실행 (더블클릭과 같음)
javafix --check 파일 검사만 하고 결과 출력 (아무것도 바꾸지 않음)
javafix --check --verify 파일 검사 + 실제 연결 검사 (인터넷 사용)
javafix --restore 되돌리기 모드로 바로 시작
javafix --lang ko|en 언어 선택 (기본: 시스템 언어)
javafix --scan-root <폴더> 지정한 폴더만 검사 (여러 번 사용 가능)
javafix --no-pause 끝날 때 엔터 대기 없이 종료
javafix --help / --version
--check 的退出码:0 = 所有阻止列表中都存在 16 个(若使用 --verify,则实际检查中无漏洞),2 = 存在需要处理的项。
在命令行中直接输入本身即视为检查同意。
| 操作系统 | 位置 |
|---|---|
| Windows | Program Files、Program Files (x86)、%LOCALAPPDATA%、%APPDATA%、%USERPROFILE%\curseforge |
| macOS | /Library/Java/JavaVirtualMachines、~/Library/Java/JavaVirtualMachines、~/Library/Application Support、/Applications、~/Applications、/Library/Internet Plug-Ins、Homebrew(/opt/homebrew、/usr/local/Cellar) |
| 通用 | 主文件夹中的隐藏文件夹(.jdks、.gradle、.lunarclient、.sdkman、.jabba 等)、JAVA_HOME |
不检查下载、桌面、文档文件夹(为避免弹出 macOS 隐私保护窗口)。
如果这些位置有 Java,请用 --scan-root 直接指定。node_modules、.git、回收站等没有 Java 的大型文件夹会被跳过。
只运行这个就安全了吗?
不是。这是阻止列表方式的临时应对。如果实际连接检查结果为 安全,说明本次的伪装证书已被阻止,
但根本解决方法是把 Java 和启动器更新到修复后的版本。
会影响 Minecraft 连接或模组吗? 被阻止的只有私钥已泄露的 16 个证书。正常网站不会使用这些证书。
更新启动器后又显示 [无阻止列表]。 如果启动器重新下载了 Java,阻止列表可能会恢复原状。请再运行一次工具。
更新了 Java 却仍显示 [无阻止列表]。
根据发行版不同,有些是以移除根证书而非阻止列表的方式修复的(例如 Temurin 25.0.5+8)。
如果实际连接检查为 安全,说明已经被阻止,即使添加阻止列表也没有问题(双重防御)。
杀毒软件发出警告。 由于是未签名的小型可执行文件,可能会被误报。你可以直接查看源码,并通过 12. 直接构建 自行构建。
没有管理员权限运行会怎样? 只更改当前用户权限下可以更改的项(启动器 Java 等),系统文件夹中的 Java 保持不变。
需要 Rust 1.74 或更高版本。不下载外部库。
cargo test
cargo build --release # target/release/javafix(.exe)
实际连接检查用的 Java 程序会将预先编译好的 probe/JavafixProbe.class 放入可执行文件中。
CI 每次都会用 javac --release 8 重新编译,并确认其与仓库中的 .class 一致。
在 GitHub 上推送 v* 标签后,.github/workflows/release.yml 会在 Windows、macOS、Linux 上运行测试,
构建 Windows x64/ARM64 exe 和 macOS 集成二进制文件(zip),并与 SHA256SUMS 一起发布到 Release。
仅使用 GitHub 官方 action(checkout、setup-java、upload/download-artifact)。
源码结构