SSL 信任库替换与 MC 抽象层

两个小型工具:一个在老 Java 上放宽 SSL 信任,一个把 Minecraft 相关调用包一层以减少直接依赖。

SSLHacker

包路径 makamys.mclib.ext.assetdirector。

属性 值
类型 TLS 信任库补丁
触发条件 AssetFetcher 的 init() 中调用 SSLHacker.hack()
配置文件 无(只有系统属性 java.version)

目的

类注释:Java 不加区分地接受 Mojang 的证书,是为了兼容 java 1.8.0_51 —— 该版本不支持 Mojang 的新证书,而很多启动器捆绑的就是这个 Java 版本。

触发条件

hack() 的判断链:

  1. 读系统属性 java.version;
  2. 必须以 1.8.0 开头;
  3. 取 _ 后的补丁号并去掉 - 之后的部分(源码按 [1] 实际等价 split("_")[1].split("-")[0]);
  4. 补丁号 < 75 时才动手。

动手前会连续 LOGGER.warn 两条:提示 Java 版本过旧、提示将替换 SSL 信任管理器。替换失败则 LOGGER.error("Failed to replace SSL trust manager! Asset downloads may fail.")。

替换内容

replaceSSLContext() 私有方法:

  1. 用 CertificateFactory.getInstance("X.509") 与空的 JKS KeyStore;
  2. 从 classpath 读入 resources/mclib/<MCLib.RESOURCES_VERSION>/certs/DigiCertGlobalRootG3.crt.pem(随 jar 打包,见 MCLib 核心与任务队列 的 RESOURCES_VERSION = "v0_3_7"),以别名 digicertglobalrootg3 存入;
  3. 用 SSLContexts.custom().loadTrustMaterial(null, null).loadTrustMaterial(keyStore, null).build() 构造新的 SSLContext;
  4. SSLContext.setDefault(fixed)。

源码 TODO 提到 8u75 与 8u101 发布说明里新增的其他根证书尚未加入。

⚠️ 这是全局替换默认 SSLContext,影响整个 JVM 的后续 HTTPS 连接,不限于 AssetDirector。

MCUtil

包路径 makamys.mclib.ext.assetdirector.mc。类注释说明用途是"提供抽象以避免 AssetDirector 的代码直接引用 Minecraft"。

成员 签名 说明
取 assets 目录 public static File getMCAssetsDir() 反射 Minecraft.fileAssets(SRG field_110446_Y)
取实例目录 public static File getInstanceDir() 直接返回 Launch.minecraftHome

MCUtil.ProgressBar

对 FML ProgressManager.ProgressBar 的包装(该类自身导入了 cpw.mods.fml.common.ProgressManager.ProgressBar 并重命名消歧)。

方法 说明
push(String title, int steps) 包住 ProgressManager.push(title, steps)
step(String message) 转发 internal.step(message)
pop() 转发 ProgressManager.pop(internal)

AssetDirector 用它在 pre-init 显示两段进度:"Downloading"(按需下载的资源数)和 "AssetDirector - Loading assets"(按注册 mod 数)。

MCUtil.Version

方法 说明
Version(String version) 内部包 ComparableVersion
compareTo(Version other) 转发给内部对象

用于 多版本原版资源包 的 1.7.10 / 1.13 路径切换判断,以及 AssetDirector.isOldLauncher 里把启动器版本和 1.6.93 比较。

资源文件

路径(classpath) 用途
resources/mclib/v0_3_7/certs/DigiCertGlobalRootG3.crt.pem SSLHacker 注入的根证书
resources/mclib/v0_3_7/updatecheck/updates.template.html UpdateCheck 结果页模板,渲染时把 {table} 占位符替换为生成的表格

相关条目