HTTPs Server

agent47

Aktives Mitglied
Hallo,

für mein Projekt benötige ich einen SSL Gesicherten Webserver. Nach etwas suchen habe ich gefunden das Java schon einen Einfachen solchen Server mitbringt. Nun habe ich versucht zum Test einen solchen Server zu starten, leider klappt das nicht.
Vorgegangen bin ich nach folgendem Tutotrial:
http://www.codeproject.com/Tips/1043003/Create-a-Simple-Web-Server-in-Java-HTTPS-Server

Java:
import com.sun.net.httpserver.*;

import javax.net.ssl.*;
import java.io.*;
import java.net.InetSocketAddress;
import java.net.URI;
import java.net.URLDecoder;
import java.security.*;
import java.security.cert.CertificateException;
import java.time.LocalDateTime;
import java.util.*;

/**
* Tutorial von http://www.codeproject.com/Tips/1040097/Create-a-Simple-Web-Server-in-Java-HTTP-Server
* und http://www.codeproject.com/Tips/1043003/Create-a-Simple-Web-Server-in-Java-HTTPS-Server
*/
public class TsteHttpServer {

    public class RootHandler implements HttpHandler {

        @Override
        public void handle(HttpExchange he) throws IOException {

            StringBuffer response = new StringBuffer();
            response.append("<html><head><title>Datum</title></head><body><h1>");
            response.append(LocalDateTime.now());
            response.append("</h1></body></html>");

            he.sendResponseHeaders(200, response.length());
            OutputStream os = he.getResponseBody();
            os.write(response.toString().getBytes());
            os.close();
        }
    }

    public class EchoHeaderHandler implements HttpHandler {

        @Override
        public void handle(HttpExchange he) throws IOException {
            Headers headers = he.getRequestHeaders();
            Set<Map.Entry<String, List<String>>> entries = headers.entrySet();
            String response = "";
            for (Map.Entry<String, List<String>> entry : entries)
                response += entry.toString() + "\n";
            he.sendResponseHeaders(200, response.length());
            OutputStream os = he.getResponseBody();
            os.write(response.toString().getBytes());
            os.close();
        }
    }

    public class EchoGetHandler implements HttpHandler {

        @Override

        public void handle(HttpExchange he) throws IOException {
            // parse request
            Map<String, Object> parameters = new HashMap<>();
            URI requestedUri = he.getRequestURI();
            String query = requestedUri.getRawQuery();
            parseQuery(query, parameters);

            // send response
            String response = "";
            for (String key : parameters.keySet())
                response += key + " = " + parameters.get(key) + "\n";
            he.sendResponseHeaders(200, response.length());
            OutputStream os = he.getResponseBody();
            os.write(response.toString().getBytes());

            os.close();
        }
    }

    public class EchoPostHandler implements HttpHandler {

        @Override

        public void handle(HttpExchange he) throws IOException {

            // parse request
            Map<String, Object> parameters = new HashMap<String, Object>();
            InputStreamReader isr = new InputStreamReader(he.getRequestBody(), "utf-8");
            BufferedReader br = new BufferedReader(isr);
            String query = br.readLine();
            parseQuery(query, parameters);

            // send response
            String response = "";
            for (String key : parameters.keySet())
                response += key + " = " + parameters.get(key) + "\n";
            he.sendResponseHeaders(200, response.length());
            OutputStream os = he.getResponseBody();
            os.write(response.toString().getBytes());
            os.close();
        }
    }

    public TsteHttpServer() throws IOException, KeyStoreException, CertificateException, NoSuchAlgorithmException, UnrecoverableKeyException, KeyManagementException {

        String keystoreFilename = "mykey.keystore";
        char[] storepass = "mypassword".toCharArray();
        char[] keypass = "mypassword".toCharArray();
        String alias = "alias";

        // load certificate
        FileInputStream fIn = new FileInputStream(keystoreFilename);
        KeyStore keystore = KeyStore.getInstance("JKS");
        keystore.load(fIn, storepass);

        // setup the key manager factory
        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
        kmf.init(keystore, keypass);

        // setup the trust manager factory
        TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
        tmf.init(keystore);

        // create ssl context
        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

        // create https server
        int port = 9000;
        HttpsServer server = HttpsServer.create(new InetSocketAddress(port), 0);

        // setup the HTTPS context and parameters
        server.setHttpsConfigurator(new HttpsConfigurator(sslContext) {
            public void configure(HttpsParameters params) {

                try {

                    // initialise the SSL context
                    SSLContext c = SSLContext.getDefault();
                    SSLEngine engine = c.createSSLEngine();
                    params.setNeedClientAuth(false);
                    params.setCipherSuites(engine.getEnabledCipherSuites());
                    params.setProtocols(engine.getEnabledProtocols());

                    // get the default parameters
                    SSLParameters defaultSSLParameters = c.getDefaultSSLParameters();
                    params.setSSLParameters(defaultSSLParameters);
                } catch (Exception ex) {

                    ex.printStackTrace();
                    System.out.println("Failed to create HTTPS server");
                }
            }
        });

        //HttpServer server = HttpServer.create(new InetSocketAddress(port), 0);
        System.out.println("server started at " + port);
        server.createContext("/", new RootHandler());
        server.createContext("/echoHeader", new EchoHeaderHandler());
        server.createContext("/echoGet", new EchoGetHandler());
        server.createContext("/echoPost", new EchoPostHandler());
        server.setExecutor(null);
        server.start();
    }

    public static void main(String[] args) throws IOException, KeyStoreException, CertificateException, NoSuchAlgorithmException, UnrecoverableKeyException, KeyManagementException {

        new TsteHttpServer();
    }

    public static void parseQuery(String query, Map<String,
            Object> parameters) throws UnsupportedEncodingException {

        if (query != null) {
            String pairs[] = query.split("[&]");
            for (String pair : pairs) {
                String param[] = pair.split("[=]");
                String key = null;
                String value = null;
                if (param.length > 0) {
                    key = URLDecoder.decode(param[0],
                            System.getProperty("file.encoding"));
                }

                if (param.length > 1) {
                    value = URLDecoder.decode(param[1],
                            System.getProperty("file.encoding"));
                }

                if (parameters.containsKey(key)) {
                    Object obj = parameters.get(key);
                    if (obj instanceof List<?>) {
                        List<String> values = (List<String>) obj;
                        values.add(value);

                    } else if (obj instanceof String) {
                        List<String> values = new ArrayList<>();
                        values.add((String) obj);
                        values.add(value);
                        parameters.put(key, values);
                    }
                } else {
                    parameters.put(key, value);
                }
            }
        }
    }
}

Der Server lässt dich ohne Fehlermeldung starten. Der Browser sagt mit dann aber "Fehler: Gesicherte Verbindung fehlgeschlagen".
Kann mir vielleicht jemand einen Tipp geben was da falsch läuft?
 

Thallius

Top Contributor
Ohne das ich mich mit Java-Web-Servern ausekenne, gehe mal davon aus, dass der Browser nur das fehlende Zertifikat bemängelt oder? Weil Du kannst zwar einen https Server einrichten, solange der aber kein gültiges Zertifikat hat (Muss man kaufen), wird kein Browser auf der Welt diesen als sichere Verbindung erkennen.

Du kannst aber normalerweise dem Browser sagen, dass Du dem Server trotzdem vertraust indem Du ein eigenes Zertifikat erstellst (kostet kein Geld) und dieses dann als vertrauenswürdig bei deinem Browser einstellst. Das geht dann aber natürlich nur mit diesem einen Browser.

Weiterhin kannst du bei jedem Browser trotzdem die Verbindung aufbauen und es ist dann tatsächlich auch eine verschlüsselte https Verbindung aber eben keine gesicherte.

Gruß

Claus
 

Bitfehler

Bekanntes Mitglied
Weil Du kannst zwar einen https Server einrichten, solange der aber kein gültiges Zertifikat hat (Muss man kaufen), wird kein Browser auf der Welt diesen als sichere Verbindung erkennen.

Nur mal so nebenbei. Es gibt seit kurzer Zeit die Initiative Let's Encrypt, bei der man kostenlos Zertifikate bekommen kann, die von den gängigen Browser auch akzeptiert werden. Der Haken dabei ist, dass diese immer nur drei Monate gültig sind und man sie dann verlängern lassen muss. Richtet man dafür einen cronjob ein, ist das aber auch kein unlösbares Problem.

Offizielle Seite: https://letsencrypt.org/

Kannst du nicht die angebotenen Verschlüsselungsmöglichkeiten von bekannten App-servern wie zum Beispiel Tomcat oder Glassfish nutzen?
 

agent47

Aktives Mitglied
Das soll eine embedded App werden die auch nur eine kleine HTTP Schnittstelle haben wird.

Wenn das Zertifikat nicht akzeptiert wird müsste der mir da nicht anbieten die Seite trotzdem zu öffnen?
 

Thallius

Top Contributor
Das soll eine embedded App werden die auch nur eine kleine HTTP Schnittstelle haben wird.

Wenn das Zertifikat nicht akzeptiert wird müsste der mir da nicht anbieten die Seite trotzdem zu öffnen?

Also bei Chrome ist das Feature ziemlich versteckt. Da gibt es dann unten auf der Seite einen kleinen link "erweitert" und wenn man da drauf klickt kann man die Seite trotzdem aufmachen.

Gruß

Claus
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
FrankenDerStein HTTP Https Server Bibliothek für Linux und Android gesucht. Netzwerkprogrammierung 7
JaXnPriVate Java HTTPS Server (Secure Sockets) Netzwerkprogrammierung 15
T HTTPS-Requests an Server: POST-Parameter kommen nicht an Netzwerkprogrammierung 5
Thallius HTTP Kann man den Raw HTTPS Request irgendwie ausgeben lassen? Netzwerkprogrammierung 6
G localhost im Backend https vs. http Netzwerkprogrammierung 9
M HTTPS Login & etwas posten Netzwerkprogrammierung 0
M Proxy und HTTPS Netzwerkprogrammierung 3
Thallius HTTP HTTPS unter Java 1.6 schlägt fehl Netzwerkprogrammierung 4
GENiALi Grizzly mit HTTPS Netzwerkprogrammierung 0
N Hintergrundlogin HTTPs Webform Netzwerkprogrammierung 5
E Gruppenchat: Über HTTPS oder nicht? Netzwerkprogrammierung 5
K HTTPS Zertifikat Netzwerkprogrammierung 3
F C/S über HTTPS Netzwerkprogrammierung 2
NoXiD Java mit HTTPS verbinden Netzwerkprogrammierung 6
T Up- und Download mit https Netzwerkprogrammierung 14
M HTTP HTTPS-Verbindung mittels Java und Javascript Netzwerkprogrammierung 2
T HTTPS einloggen Netzwerkprogrammierung 9
L Https Verbindung wird aus jar heraus nicht aufgebaut Netzwerkprogrammierung 12
E HTTPS Debuggen (verschlüsselte Daten anzeigen)? Netzwerkprogrammierung 12
Q HTTPS mit Apache HttpClient Netzwerkprogrammierung 4
M HTTPS Seiten runterladen Netzwerkprogrammierung 2
C HTTPS mit Apache HTTPClient Netzwerkprogrammierung 1
A HTTPS-Request via Proxy mit Konfigurationsskript Netzwerkprogrammierung 3
P HTTPS - öffentliches Zertifikat - ermitteln Netzwerkprogrammierung 5
G file download über https mit p12 Zertifikat Netzwerkprogrammierung 4
F http Post auf einen Grafana Server Netzwerkprogrammierung 3
W Socket Server -> lesen von / schreiben zu php-script Netzwerkprogrammierung 6
E Server mit GUI Netzwerkprogrammierung 4
E FTP FTPS Server gibt Fehlernachricht "522 SSL/TLS required on the data channel" zurück Netzwerkprogrammierung 1
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
Eigenen Rechner als Server? Netzwerkprogrammierung 16
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
J Datei Download vom Server Netzwerkprogrammierung 8
izoards Mehrere TCP Verbindungen auf einen Server [alles Local] Netzwerkprogrammierung 2
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
J Client-Server und SOAP Netzwerkprogrammierung 23
K Threads/Server/telnet Fehler Netzwerkprogrammierung 2
J Multithreaded-Server Netzwerkprogrammierung 21
L30nS RMI RMI-Server kann Dialog nicht volkommen anzeigen Netzwerkprogrammierung 2
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
S Von Java auf passwortgeschützten Server zugreifen + Umgang mit Ports Netzwerkprogrammierung 28
S Probleme bei Java-Installation auf Server (Linux/Shell/Terminal) Netzwerkprogrammierung 6
S Java: Anbindung an einen realen Server? (+ Portfreigabe) Netzwerkprogrammierung 8
D Server - Client Informationsaustausch, Möglichkeiten Netzwerkprogrammierung 3
H Socket Kann ein Socket server 2 dimensionale Arrays empfangen und versenden? Netzwerkprogrammierung 3
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
S HTTP Post?!? - Java Server Netzwerkprogrammierung 7
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
D Slf4j - Logging - Client-Server Architektur Netzwerkprogrammierung 3
F NodeJs-Server auf Firebase hosten ? Netzwerkprogrammierung 3
J client server mit nur einem PC Netzwerkprogrammierung 33
M Socket Nachricht von TCP-Client an Server schicken Netzwerkprogrammierung 12
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
H HTTP Glassfish (v5) Application Server - Bibliothek zur Verfügung stellen Netzwerkprogrammierung 4
B HttpClient - Server (Jetty) - getInputStream - EOF Netzwerkprogrammierung 3
P TCP-Server Netzwerkprogrammierung 1
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
F Server für Java Applikationen Netzwerkprogrammierung 16
H Einfacher Server funktioniert nicht Netzwerkprogrammierung 1
G Server-Client IO Problem Netzwerkprogrammierung 6
T Mikrofonaudio über Java Server an Webbrowser streamen Netzwerkprogrammierung 13
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
L Socket Wie kann ich checken ob ein User eine Nachricht per Outputstream an den Server gesendet hat? Netzwerkprogrammierung 1
T Jetty Server LOGGING Netzwerkprogrammierung 1
L Strings an Server senden und in MYSQL speichern? Netzwerkprogrammierung 3
Aruetiise Socket Java Programm auf Server Netzwerkprogrammierung 3
T server empfängt nur 1 Buchstaben vom String Netzwerkprogrammierung 1
S Spiel mit Server programmieren Netzwerkprogrammierung 2
N Post u Head Request an Server Netzwerkprogrammierung 4
J Socket Ein Chat Server Tutorial Netzwerkprogrammierung 8
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
J Socket Tutorial zu Multiplayer Server schreiben? Netzwerkprogrammierung 5
S Java Chat Server Netzwerkprogrammierung 8
E Kurze Textnachrichten über einen Server von meinem Handy auf den Computer laden. Netzwerkprogrammierung 9
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
D Socket Message an einen Server senden? Netzwerkprogrammierung 8
J FTP FTP Zugriff über Proxy Server Netzwerkprogrammierung 1
KaffeeFan Programmierung mit Cloud-Server Netzwerkprogrammierung 0
L Socket Problem mit Server Netzwerkprogrammierung 1
cezary Socket Paralleler Server ? Netzwerkprogrammierung 1
I Socket Leicht zu DDosender Server Netzwerkprogrammierung 4
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
J Prüfen, ob remote UDT Server erreichbar ist Netzwerkprogrammierung 0
P Server als Client nutzen Netzwerkprogrammierung 8
S Server Kommunikation Netzwerkprogrammierung 1
V einfaches hin und her von Text über Server Netzwerkprogrammierung 2
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
Cromewell Socket Multithreaded Server und Client Netzwerkprogrammierung 1
Y Client/Server/DB communication Netzwerkprogrammierung 3
JavaWolf165 Socket mit .writeUtf etwas vom Client zum Server schicken Netzwerkprogrammierung 13
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben