HOWTO · Java

Java で HTTPS サーバーを作成する

このチュートリアルでは、Java で単純な HTTPS サーバーを作成する方法を示します。

Secure Hypertext Transfer Protocol (HTTPS) は、インターネットを介した安全な通信を保証する安全なプロトコルです。 HTTPS は、秘密鍵のペアとデジタル証明書を使用して、受信者と送信者を検証します。

このチュートリアルでは、Java で単純な HTTPS サーバーを作成する方法を示します。

Java で HTTPS サーバーを作成する

JAVA で HTTPS サーバーを作成する前に、サーバーが使用するキーストアとトラストストアが生成されていることを確認する必要があります。 それらを生成するには、次の手順に従います。

  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. これは、testkey.jks ファイルが bin フォルダーに生成されたことを意味します。これを Java プロジェクト フォルダーにコピーして、プログラムにロードします。

キーストアとトラストストアが生成されたら、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

出力 (ブラウザーで):

レスポンス