Crear un servidor HTTPS en Java

Sheeraz Gul 12 octubre 2023
Crear un servidor HTTPS en Java

El Protocolo seguro de transferencia de hipertexto (HTTPS) es un protocolo seguro que garantiza una comunicación segura a través de Internet. El HTTPS utiliza un par de claves privadas y un certificado digital para verificar el receptor y el remitente.

Este tutorial demostrará la creación de un servidor HTTPS simple en Java.

Crear un servidor HTTPS en Java

Antes de crear un servidor HTTPS en JAVA, debemos asegurarnos de haber generado Keystore y Truststore, que utilizará el servidor. Para generarlos, siga los siguientes pasos:

  1. Abra el símbolo del sistema como administrador.

  2. Vaya a la ruta del directorio bin de Java en cmd.

  3. Ahora ejecuta el siguiente comando:

    keytool -genkeypair -keyalg RSA -alias selfsigned -keystore testkey.jks -storepass password -validity 360 -keysize 2048
    
  4. Este comando le preguntará su apellido, unidad organizativa, organización, ciudad, estado y código de país de dos letras. Proporcione toda la información.

  5. Escriba y presione Enter como último paso.

    Producción:

    Almacén de claves HTTPS

  6. Esto significa que el archivo testkey.jks se ha generado en la carpeta bin, cópielo en la carpeta de su proyecto Java para cargarlo en el programa.

Una vez que se generan Keystore y Truststore, podemos crear un servidor HTTPS en JAVA.

Ejemplo:

package delftstack;

import com.sun.net.httpserver.*;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpsExchange;
import com.sun.net.httpserver.HttpsServer;
import java.io.*;
import java.net.InetSocketAddress;
import java.security.KeyStore;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLEngine;
import javax.net.ssl.SSLParameters;
import javax.net.ssl.TrustManagerFactory;

public class HTTPS_Server {
  public static class MyHandler implements HttpHandler {
    @Override
    public void handle(HttpExchange x) throws IOException {
      String Response = "This is the response from delftstack";
      HttpsExchange HTTPS_Exchange = (HttpsExchange) x;
      x.getResponseHeaders().add("Access-Control-Allow-Origin", "*");
      x.sendResponseHeaders(200, Response.getBytes().length);
      OutputStream Output_Stream = x.getResponseBody();
      Output_Stream.write(Response.getBytes());
      Output_Stream.close();
    }
  }

  public static void main(String[] args) throws Exception {
    try {
      // setup the socket address
      InetSocketAddress Inet_Address = new InetSocketAddress(9000);

      // initialize the HTTPS server
      HttpsServer HTTPS_Server = HttpsServer.create(Inet_Address, 0);
      SSLContext SSL_Context = SSLContext.getInstance("TLS");

      // initialise the keystore
      char[] Password = "password".toCharArray();
      KeyStore Key_Store = KeyStore.getInstance("JKS");
      FileInputStream Input_Stream = new FileInputStream("testkey.jks");
      Key_Store.load(Input_Stream, Password);

      // setup the key manager factory
      KeyManagerFactory Key_Manager = KeyManagerFactory.getInstance("SunX509");
      Key_Manager.init(Key_Store, Password);

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

      // setup the HTTPS context and parameters
      SSL_Context.init(Key_Manager.getKeyManagers(), Trust_Manager.getTrustManagers(), null);
      HTTPS_Server.setHttpsConfigurator(new HttpsConfigurator(SSL_Context) {
        public void configure(HttpsParameters params) {
          try {
            // initialise the SSL context
            SSLContext SSL_Context = getSSLContext();
            SSLEngine SSL_Engine = SSL_Context.createSSLEngine();
            params.setNeedClientAuth(false);
            params.setCipherSuites(SSL_Engine.getEnabledCipherSuites());
            params.setProtocols(SSL_Engine.getEnabledProtocols());

            // Set the SSL parameters
            SSLParameters SSL_Parameters = SSL_Context.getSupportedSSLParameters();
            params.setSSLParameters(SSL_Parameters);
            System.out.println("The HTTPS server is connected");

          } catch (Exception ex) {
            System.out.println("Failed to create the HTTPS port");
          }
        }
      });
      HTTPS_Server.createContext("/test", new MyHandler());
      HTTPS_Server.setExecutor(null); // creates a default executor
      HTTPS_Server.start();

    } catch (Exception exception) {
      System.out.println("Failed to create HTTPS server on port " + 9000 + " of localhost");
      exception.printStackTrace();
    }
  }
}

El código anterior crea un servidor HTTPS de host local en el número de puerto 9000, que se puede usar para cualquier cosa.

Salida (en el IDE):

The HTTPS server is connected

Salida (en el navegador):

Respuesta

Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook

Artículo relacionado - Java HTTPS