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() 的判断链:
- 读系统属性
java.version; - 必须以
1.8.0开头; - 取
_后的补丁号并去掉-之后的部分(源码按[1]实际等价split("_")[1].split("-")[0]); - 补丁号
< 75时才动手。
动手前会连续 LOGGER.warn 两条:提示 Java 版本过旧、提示将替换 SSL 信任管理器。替换失败则 LOGGER.error("Failed to replace SSL trust manager! Asset downloads may fail.")。
替换内容
replaceSSLContext() 私有方法:
- 用
CertificateFactory.getInstance("X.509")与空的JKSKeyStore; - 从 classpath 读入
resources/mclib/<MCLib.RESOURCES_VERSION>/certs/DigiCertGlobalRootG3.crt.pem(随 jar 打包,见 MCLib 核心与任务队列 的RESOURCES_VERSION = "v0_3_7"),以别名digicertglobalrootg3存入; - 用
SSLContexts.custom().loadTrustMaterial(null, null).loadTrustMaterial(keyStore, null).build()构造新的SSLContext; 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} 占位符替换为生成的表格 |
相关条目
- AssetFetcher -
SSLHacker.hack()的调用方 - AssetDirector -
MCUtil.ProgressBar的使用方 - UpdateCheck - 使用
updates.template.html模板