HOWTO · Java

자바에서 HTTPS 서버 생성

이 자습서는 Java에서 간단한 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

출력(브라우저에서):

응답