Undertow Core HTTPS服务器给出400个坏请求

问题描述 投票:0回答:1

我使用io.underow.core设置了Java HTTPS服务器,创建了HttpListener,看起来我的代码很完美,但是...... 它不工作。任何请求都会给我400 Bad Request。

以下是与 undertow、http 等相关的代码。

package ru.epserv.epmodule.modules.serverapi;

import org.bukkit.Bukkit;
import org.json.simple.JSONObject;

import io.undertow.Undertow;
import io.undertow.server.HttpHandler;
import io.undertow.server.HttpServerExchange;
import ru.epserv.epmodule.modules.serverapi.contexts.BanwhyContext;
import ru.epserv.epmodule.modules.serverapi.contexts.FirstseenContext;
import ru.epserv.epmodule.modules.serverapi.contexts.GetPlayerContext;
import ru.epserv.epmodule.modules.serverapi.contexts.GetPlayersContext;
import ru.epserv.epmodule.modules.serverapi.contexts.GetWarningsContext;
import ru.epserv.epmodule.modules.serverapi.contexts.IsOnlineContext;
import ru.epserv.epmodule.modules.serverapi.contexts.LastseenContext;
import ru.epserv.epmodule.modules.serverapi.contexts.Ping;
import ru.epserv.epmodule.modules.serverapi.contexts.SendContext;
import ru.epserv.epmodule.modules.serverapi.contexts.SkillsContext;
import ru.epserv.epmodule.modules.serverapi.contexts.TimeplayedContext;
import ru.epserv.epmodule.modules.serverapi.contexts.UptimeContext;
import ru.epserv.epmodule.modules.serverapi.utils.ParsedRequest;

public class HTTPSServer {

    public static String notFound;
    public Undertow server;

    @SuppressWarnings("unchecked")
    public void start() {
        JSONObject notFoundJSON = new JSONObject();
        notFoundJSON.put("response", null);
        notFoundJSON.put("error", "not_found");

        HTTPSServer.notFound = notFoundJSON.toJSONString();

        Ping ping = new Ping();
        SendContext send = new SendContext();
        GetPlayersContext list = new GetPlayersContext();
        IsOnlineContext isOnline = new IsOnlineContext();
        UptimeContext uptime = new UptimeContext();
        FirstseenContext firstseen = new FirstseenContext();
        LastseenContext lastseen = new LastseenContext();
        TimeplayedContext timeplayed = new TimeplayedContext();
        BanwhyContext banwhy = new BanwhyContext();
        GetWarningsContext getWarnings = new GetWarningsContext();
        SkillsContext skills = new SkillsContext();
        GetPlayerContext getPlayer = new GetPlayerContext();

        this.server = Undertow.builder()
                .addHttpsListener(45105, "0.0.0.0", HTTPSServer.getSSLContextFromLetsEncrypt())
                .setHandler(new HttpHandler() {

                    @Override
                    public void handleRequest(final HttpServerExchange t) throws Exception {
                        ParsedRequest r = new ParsedRequest(t);
                        r.setResponseHeader("Access-Control-Allow-Origin", "*");
                        Bukkit.getLogger().warning(r.getRequestURI().getPath());
                        switch (r.getRequestURI().getPath().substring(1).trim()) {
                        case "ping":
                            ping.handle(r, t);
                            break;
                        case "send":
                            send.handle(r, t);
                            break;
                        case "list":
                            list.handle(r, t);
                            break;
                        case "isonline":
                            ServerAPI.log
                                    .warn("Отправлен запрос на устаревший адрес https://mc.epserv.ru:45105/isonline, "
                                            + "используйте isOnline. Адрес подключения: "
                                            + r.getRemoteAddress().toString() + ". User-Agent: "
                                            + r.getRequestHeaders().getFirst("User-Agent") + ".");
                            isOnline.handle(r, t);
                            break;
                        case "isOnline":
                            isOnline.handle(r, t);
                            break;
                        case "uptime":
                            uptime.handle(r, t);
                            break;
                        case "firstseen":
                            firstseen.handle(r, t);
                            break;
                        case "lastseen":
                            lastseen.handle(r, t);
                            break;
                        case "timeplayed":
                            timeplayed.handle(r, t);
                            break;
                        case "banwhy":
                            banwhy.handle(r, t);
                            break;
                        case "getWarnings":
                            getWarnings.handle(r, t);
                            break;
                        case "skills":
                            skills.handle(r, t);
                            break;
                        case "getPlayer":
                            getPlayer.handle(r, t);
                            break;
                        default:
                            r.setResponseCode(404);
                            r.write(HTTPSServer.notFound);
                            r.send();
                        }
                    }
                })
                .build();
        this.server.start();
    }

    public void stop() {
        server.stop();
    }

}

我还试着用以下方法来获取更多信息 curl -v --data "" https://mc.epserv.ru:45105/list,这是输出。

boom@kali:~$ curl -v --data "" https://mc.epserv.ru:45105/list
 *   Trying 5.228.179.67:45105...
 * TCP_NODELAY set
 * Connected to mc.epserv.ru (5.228.179.67) port 45105 (#0)
 * ALPN, offering h2
 * ALPN, offering http/1.1
 * successfully set certificate verify locations:
 *   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
 * TLSv1.3 (OUT), TLS handshake, Client hello (1):
 * TLSv1.3 (IN), TLS handshake, Server hello (2):
 * TLSv1.2 (IN), TLS handshake, Certificate (11):
 * TLSv1.2 (IN), TLS handshake, Server key exchange (12):
 * TLSv1.2 (IN), TLS handshake, Server finished (14):
 * TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
 * TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
 * TLSv1.2 (OUT), TLS handshake, Finished (20):
 * TLSv1.2 (IN), TLS handshake, Finished (20):
 * SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
 * ALPN, server did not agree to a protocol
 * Server certificate:
 *  subject: CN=mc.epserv.ru
 *  start date: May 18 13:27:54 2020 GMT
 *  expire date: Aug 16 13:27:54 2020 GMT
 *  subjectAltName: host "mc.epserv.ru" matched cert's "mc.epserv.ru"
 *  issuer: C=US; O=Let's Encrypt; CN=Let's Encrypt Authority X3
 *  SSL certificate verify ok.
> POST /list HTTP/1.1
> Host: mc.epserv.ru:45105
> User-Agent: curl/7.68.0
> Accept: */*
> Content-Length: 0
> Content-Type: application/x-www-form-urlencoded
> 
 * Mark bundle as not supporting multiuse
< HTTP/1.1 400 Bad Request
< Content-Length: 0
< Connection: close
< 
 * Closing connection 0
 * TLSv1.2 (OUT), TLS alert, close notify (256):

我试着用 AccessLogHandler, RequestDumpingHandler但什么都没有,Undertow没有任何记录,继续回复400 Bad Request。

我到底做错了什么?我发现了一个bug还是什么?有什么问题?如果需要的话,可以问我更多的信息,如果我的英语不好,请见谅

java ssl https bad-request undertow
1个回答
0
投票

问题解决了--我又在Undertow中建立了一个有 mvn install (自 https://github.com/undertow-io/undertow repo),现在可以正常工作了。这可能是Undertow 2.1.2.Final-SNAPSHOT的一个bug,但在Undertow 2.1.4.Final-SNAPSHOT上,一切都能正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.