자바에서 HTTPS 서버 생성

Sheeraz Gul 2023년10월12일
자바에서 HTTPS 서버 생성

HTTPS(Secure Hypertext Transfer Protocol)는 인터넷을 통한 안전한 통신을 보장하는 보안 프로토콜입니다. HTTPS는 한 쌍의 개인 키와 디지털 인증서를 사용하여 수신자와 발신자를 확인합니다.

이 자습서에서는 Java로 간단한 HTTPS 서버를 만드는 방법을 보여줍니다.

자바에서 HTTPS 서버 생성

JAVA에서 HTTPS 서버를 생성하기 전에 서버가 사용할 Keystore 및 Truststore를 생성했는지 확인해야 합니다. 이를 생성하려면 아래 단계를 따르십시오.

  1. 관리자 권한으로 명령 프롬프트를 엽니다.

  2. cmd에서 Java bin 디렉토리의 경로로 이동합니다.

  3. 이제 다음 명령을 실행합니다.

    keytool -genkeypair -keyalg RSA -alias selfsigned -keystore testkey.jks -storepass password -validity 360 -keysize 2048
    
  4. 이 명령은 성, 조직 단위, 조직, 도시, 주 및 2자리 국가 코드를 묻습니다. 모든 정보를 제공하십시오.

  5. yes를 입력하고 마지막 단계에서 Enter를 누릅니다.

    출력:

    HTTPS 키 저장소

  6. 이는 bin 폴더에 testkey.jks 파일이 생성되었음을 의미합니다. Java 프로젝트 폴더에 복사하여 프로그램에 로드합니다.

Keystore와 Truststore가 생성되면 JAVA에서 HTTPS 서버를 생성할 수 있습니다.

예:

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();
    }
  }
}

위의 코드는 무엇이든 사용할 수 있는 포트 번호 9000에 로컬 호스트 HTTPS 서버를 생성합니다.

출력(IDE에서):

The HTTPS server is connected

출력(브라우저에서):

응답

작가: Sheeraz Gul
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

관련 문장 - Java HTTPS