yushijinhun / authlib-injector

Build your own Minecraft authentication system.
https://authlib-injector.yushi.moe
GNU Affero General Public License v3.0
744 stars 67 forks source link

使用高版本 Java 和 LittleSkin 短域名 API 地址启动服务器时报错 #139

Closed LuckXuemo closed 2 years ago

LuckXuemo commented 2 years ago

Win10 OS 上使用 Java 16/17 (Oracle JDK/Liberica JDK) 以及 authlib-injector 最新版本 (1.1.39) 在 LittleSkin 短域名API 地址 (https://littlesk.in/api/yggdrasil) 作为参数值的情况下启动服务器报错。但是使用该地址与 Java 8 或者重定向后的地址 (https://mcskin.littleservice.cn/api/yggdrasil) 与 Java 8/17 均能正常启动。

启动参数: java -javaagent:authlib-injector.jar=https://littlesk.in/api/yggdrasil -jar server.jar nogui

完整日志:

[authlib-injector] [INFO] Version: 1.1.39
[authlib-injector] [INFO] Authentication server: https://littlesk.in/api/yggdrasil
[authlib-injector] [ERROR] Failed to fetch metadata: java.net.SocketException: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
[authlib-injector] [DEBUG] A known exception has occurred
moe.yushi.authlibinjector.InitializationException: java.net.SocketException: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
    at moe.yushi.authlibinjector.AuthlibInjector.fetchAPIMetadata(AuthlibInjector.java:172)
    at moe.yushi.authlibinjector.AuthlibInjector.bootstrap(AuthlibInjector.java:93)
    at moe.yushi.authlibinjector.Premain.initInjector(Premain.java:52)
    at moe.yushi.authlibinjector.Premain.premain(Premain.java:30)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:491)
    at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:503)
Caused by: java.net.SocketException: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
    at java.base/sun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:2048)
    at java.base/sun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:2043)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:569)
    at java.base/sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:2042)
    at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1609)
    at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1589)
    at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:224)
    at moe.yushi.authlibinjector.AuthlibInjector.fetchAPIMetadata(AuthlibInjector.java:167)
    ... 9 more
Caused by: java.net.SocketException: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
    at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:325)
    at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
    at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
    at java.base/java.net.Socket$SocketInputStream.read(Socket.java:966)
    at java.base/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:478)
    at java.base/sun.security.ssl.SSLSocketInputRecord.readHeader(SSLSocketInputRecord.java:472)
    at java.base/sun.security.ssl.SSLSocketInputRecord.decode(SSLSocketInputRecord.java:160)
    at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:111)
    at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1500)
    at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1415)
    at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:450)
    at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:421)
    at java.base/sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:580)
    at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:183)
    at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1665)
    at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1589)
    at java.base/sun.net.www.protocol.http.HttpURLConnection.getHeaderField(HttpURLConnection.java:3221)
    at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getHeaderField(HttpsURLConnectionImpl.java:261)
    at moe.yushi.authlibinjector.AuthlibInjector.fetchAPIMetadata(AuthlibInjector.java:146)
    ... 9 more

本地 cURL 请求响应头信息: PS curl -IL "https://littlesk.in/api/yggdrasil"

HTTP/1.1 307 Temporary Redirect Date: Tue, 12 Oct 2021 15:32:45 GMT Connection: keep-alive strict-transport-security: max-age=63072000; includeSubDomains; preload cache-control: public, max-age=0, must-revalidate content-length: 0 x-authlib-injector-api-location: https://mcskin.littleservice.cn/api/yggdrasil x-ip-location: CN location: https://mcskin.littleservice.cn/api/yggdrasil x-vercel-cache: MISS age: 0 server: Vercel x-vercel-id: hnd1::sfo1::h4rv7-1634052765539-a4e9ce5c678e

HTTP/1.1 200 OK Server: nginx Date: Tue, 12 Oct 2021 15:32:37 GMT Content-Type: application/json X-NWS-UUID-VERIFY: 175834433e83b1cfe54c230bb2d747da Vary: Accept-Encoding X-Authlib-Injector-API-Location: https://mcskin.littleservice.cn/api/yggdrasil Set-Cookie: locale=en; expires=Tue, 12-Oct-2021 17:32:46 GMT; Max-Age=7200; path=/; httponly; samesite=lax X-Daa-Tunnel: hop_count=1 Cache-Control: private, no-cache Transfer-Encoding: chunked X-NWS-LOG-UUID: 9925939898954113967 Connection: keep-alive X-Cache-Lookup: Cache Miss Strict-Transport-Security: max-age=31536000;includeSubDomains

yushijinhun commented 2 years ago

我测试没有任何问题,可能是你网络问题,或 LittleSkin 服务不稳定导致。

此外,不需要指定完整 URL,使用 -javaagent:authlib-injector.jar=littlesk.in 即可。

Big-Cake-jpg commented 2 years ago

littlesk.in 用的是 Cloudflare 的服务,所以延迟会比较高

LuckXuemo commented 2 years ago

在更早之前使用 https://littlesk.in/api/yggdrasil 地址时重定向返回的状态码是 301,服务器启动正常。而当时使用此地址启动服务器时控制台报错(错误日志见上文),同时我注意到此时 LittleSkin 服务器对于 https://littlesk.in/api/yggdrasil 地址重定向返回的状态码为 307。数天后我发现对于这个地址又能够正常使用,且重定向时返回的状态码变回了 301(可能是 LittleSkin 服务做了相关变动)。

虽然不影响使用(可以使用重定向后的地址等方式),但我不知道这会不会是一个潜在的问题(因为当时使用 JDK 8 测试的时候并没有这个问题)。

另外,感谢回复。

LuckXuemo commented 2 years ago

littlesk.in 用的是 Cloudflare 的服务,所以延迟会比较高

延迟确实会有点高(100+ms),但应该不是这个原因导致的,当时我(从 JDK 16/17)换用 JDK 8 启动 MC 服务器测试的时候一切正常,多次用 curl 模拟请求也都能够正常响应。唯一不同的可能就是重定向时的状态码了(使用 littlesk.in 域名的时候 LittleSkin 会根据客户端的 IP 位置重定向到 littleskin.cn 或者 mcskin.littleservice.cn)。