Как заставить сокет сервера SSL поддерживать как http, так и https в java?

Я пытаюсь создать простой веб-сервер, используя java-сокеты, которые должны поддерживать как http, так и https. Но я могу добиться только одного за раз. Мне нужна логика, которая одновременно поддерживает как http @ порт 80, так и https @ порт 443.
Это пример кода для сервера HTTPS с использованием sslsocket. Мы можем получить HTTP-сервер, используя простой ServerSocket.

public class HttpsServer {
    public static void main(String[] args) {
    try {
        KeyStore ks = KeyStore.getInstance("PKCS12");
        ks.load(new FileInputStream("/opt/p12file.p12"), "p12pass".toCharArray());
        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        kmf.init(ks, "p12pass".toCharArray());

        SSLContext sc = SSLContext.getInstance("TLS");
        sc.init(kmf.getKeyManagers(), null, null);

        SSLServerSocketFactory ssf = sc.getServerSocketFactory();
        SSLServerSocket s = (SSLServerSocket) ssf.createServerSocket(8080);

        while (true) {
            SSLSocket c = (SSLSocket) s.accept();
            BufferedWriter w = new BufferedWriter(new OutputStreamWriter(c.getOutputStream()));
            w.write("HTTP/1.0 200 OK");
            w.newLine();
            w.write("Content-Type: text/html");
            w.newLine();
            w.newLine();
            w.write("<html><body><h1>Https Server Works</h1></body></html>");
            w.newLine();
            w.flush();
            w.close();
            c.close();
        }
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

}

Кто-нибудь может мне помочь??


person Ranjith    schedule 28.05.2015    source источник
comment
Почему вы не используете веб-контейнер? Вы действительно пытаетесь реализовать протокол http самостоятельно?   -  person Steven Pessall    schedule 28.05.2015
comment
Я пытаюсь реализовать эту функцию в приложении для Android. @СтивенПессолл   -  person Ranjith    schedule 28.05.2015
comment
Приложение для Android, которое используется в качестве HttpServer? Честно говоря, это звучит как грязный дизайн системы.   -  person Steven Pessall    schedule 28.05.2015
comment
Это не полноценный HTTP-сервер в Android. Просто простой фоновый сервис, который использует сокет для получения http-ответа, когда что-то публикуется из браузера. Я достиг http-сервера (на основе сокета) и https-сервера (на основе sslsocket) в качестве приложения для Android отдельно. Теперь я хочу объединить эти вещи. Спасибо. @СтивенПессолл   -  person Ranjith    schedule 28.05.2015


Ответы (2)


Как заставить сокет сервера SSL поддерживать как http, так и https в java?

Вы не можете. HTTP — это открытый текст, который SSLServerSocket не поддерживает.

Я пытаюсь создать простой веб-сервер, используя java-сокеты, которые должны поддерживать как http, так и https. Но я могу достичь только одного за раз. Мне нужна логика, которая одновременно поддерживает как http @ порт 80, так и https @ порт 443.

Тебе нужно:

  • открытый текст ServerSocket прослушивание в 80
  • SSLServerSocket прослушивание в 443
  • поток приема-цикла для каждого из этих
  • поток соединения на принятый сокет.

Вы никогда не сделаете это внутри статического метода main(). Я предлагаю вам прочитать раздел «Пользовательские сети» в учебнике по Java, а затем — Справочное руководство по JSSE.

Вам также, конечно, нужно внимательно изучить RFC 2616 HTTP 1.1. Это крайне нетривиально реализовать правильно.

Как было предложено в комментариях, вы действительно должны использовать что-то готовое.

person user207421    schedule 28.05.2015

У вас есть два варианта:

  • Используйте два разных порта, один для http и один для https.

  • Обнаружение SSL Hello / объединение портов:

    В HTTP и HTTPS ожидается, что клиент будет говорить первым. Таким образом, сервер может использовать это для определения протокола, который ожидает клиент:

    • if the client sends a TLS ClientHello, then proceed with a TLS handshake;
    • если вместо этого отправляется простой HTTP-запрос, обработайте запрос как есть.

Дополнительная информация:

person マルちゃん だよ    schedule 30.10.2018