main
- TextureUrlCheckerMixin: 放行 skin.starlight.cool 域名(必需) - YggdrasilMinecraftSessionServiceMixin: 用皮肤站公钥验签,INVALID 改 SIGNED - GameProfileSignatureTrust: 内置公钥 + 运行时从皮肤站拉取兜底 - Minecraft 26.1.2 / Fabric / Java 25
StarlightSkin
让装了 authlib-injector(指向 StarLight 皮肤站)的 Minecraft 客户端能正常显示皮肤站的皮肤。
- Minecraft 26.1.2 / Fabric
- 纯客户端 Mod
原理
Minecraft 客户端对皮肤 URL 有硬编码的域名白名单:
// com.mojang.authlib.yggdrasil.TextureUrlChecker
private static final Set<String> ALLOWED_DOMAINS = Set.of("textures.minecraft.net");
皮肤站下发的皮肤 URL(https://skin.starlight.cool/yggdrasil/textures/...)域名不在白名单里,
isAllowedTextureDomain 返回 false,unpackTextures 直接丢弃该皮肤并打印:
Textures payload url is invalid: https://skin.starlight.cool/yggdrasil/textures/xxx
结果就是所有皮肤站玩家的皮肤都显示成默认皮肤。
本 Mod 通过两个 Mixin 解决:
-
TextureUrlCheckerMixin(必需) 注入TextureUrlChecker.isAllowedTextureDomain,在默认判定为false时, 额外放行skin.starlight.cool域名。 -
YggdrasilMinecraftSessionServiceMixin皮肤站用自己私钥对textures属性签名,客户端默认不信任该公钥(SignatureState.INVALID)。 本 Mixin 在验签失败时,用皮肤站公钥(内置 / 运行时拉取)重新验签,通过则改为SIGNED。
公钥
- 内置兜底公钥(来自皮肤站
https://skin.starlight.cool/yggdrasil的signaturePublickey) - 启动时优先从皮肤站拉取,失败则用内置
构建
# 需要 Java 25
./gradlew build
产物:build/libs/starlight-skin-<version>.jar,放入 .minecraft/mods/。
已知约束
- 皮肤站域名硬编码为
skin.starlight.cool(见StarlightConstants)。 若换域名,需改StarlightConstants.ALLOWED_SKIN_DOMAINS并重新构建。
Languages
Java
100%