web-dev-qa-db-ja.com

HTTPS / HTTPポートを実行するためのSpring Bootのセットアップ方法

Springブートには、WebポートとSSL設定を構成するいくつかのプロパティがありますが、SSL証明書が設定されると、httpポートがhttpsポートに変わります。

したがって、たとえば80と443を同時に実行するには、両方のポートをその上で実行し続けることができますか?

ご覧のとおり、1つのポートのプロパティのみがあります。この場合、「server.ssl」が有効になっているため、httpポートが自動的に無効になります。

##############
### Server ###
##############
server.port=9043
server.session-timeout=1800
server.ssl.key-store=file:///C:/Temp/config/localhost.jks
server.ssl.key-store-password=localhost
server.ssl.key-password=localhost
server.ssl.trust-store=file:///C:/Temp/config/localhost.jks
server.ssl.trust-store-password=localhost

TomcatやUndertowでも使用しようとしています。助けていただければ幸いです!

30
Carlos Alberto

プロパティを使用したスプリングブート構成では、1つのコネクタのみを構成できます。必要なのは複数のコネクタであり、そのためにはConfigurationクラスを作成する必要があります。の指示に従ってください

https://docs.spring.io/spring-boot/docs/1.2.3.RELEASE/reference/html/howto-embedded-servlet-containers.html

プロパティを介してhttpsを設定し、次にEmbeddedServletContainerCustomizerを介してhttpを設定する実用的な例を見つけることができます

http://izeye.blogspot.com/2015/01/configure-http-and-https-in-spring-boot.html?showComment=1461632100718#c4988529876932015554

server:
  port:
    8080
  ssl:
    enabled:
      true
    keyStoreType:
      PKCS12
    key-store:
      /path/to/keystore.p12
    key-store-password:
      password
  http:
    port:
      8079

@Configuration
public class TomcatConfig {

@Value("${server.http.port}")
private int httpPort;

@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
    return new EmbeddedServletContainerCustomizer() {
        @Override
        public void customize(ConfigurableEmbeddedServletContainer container) {
            if (container instanceof TomcatEmbeddedServletContainerFactory) {
                TomcatEmbeddedServletContainerFactory containerFactory =
                        (TomcatEmbeddedServletContainerFactory) container;

                Connector connector = new Connector(TomcatEmbeddedServletContainerFactory.DEFAULT_PROTOCOL);
                connector.setPort(httpPort);
                containerFactory.addAdditionalTomcatConnectors(connector);
            }
        }
    };
}
}
37

現在受け入れられている答えは完全に機能しますが、Spring Boot 2.0.0以降で動作するようにするには、ある程度の適応が必要です。

@Component
public class HttpServer {
  @Bean
  public ServletWebServerFactory servletContainer(@Value("${server.http.port}") int httpPort) {
      Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
      connector.setPort(httpPort);

      TomcatServletWebServerFactory Tomcat = new TomcatServletWebServerFactory();
      Tomcat.addAdditionalTomcatConnectors(connector);
      return Tomcat;
  }
}

またはkotlinバージョン:

@Component
class HttpServer {
  @Bean
  fun servletContainer(@Value("\${server.http.port}") httpPort: Int): ServletWebServerFactory {
    val connector = Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL)
    connector.setPort(httpPort)

    val Tomcat = TomcatServletWebServerFactory()
    Tomcat.addAdditionalTomcatConnectors(connector)
    return Tomcat
  }
}
20
NickDK

Bellowは、アンダートウの両方のHTTP/HTTPSポートを有効にする方法の簡単な例です。

Spring Bootでは、構成によって1つのポートのみを開くことができます。 2番目のポートはプログラムで開く必要があります。

最初にプログラムでHTTPポートを開きます。

import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;

@Configuration
public class UndertowConfig {

@Value("${server.http.port}")
private int httpPort;

@Value("${server.http.interface}")
private String httpInterface;

@Bean
public WebServerFactoryCustomizer<UndertowServletWebServerFactory> containerCustomizer() {
    return (WebServerFactoryCustomizer) factory -> {
        UndertowServletWebServerFactory undertowFactory = (UndertowServletWebServerFactory) factory;
        undertowFactory.getBuilderCustomizers().add(builder -> {
            builder.addHttpListener(httpPort, httpInterface);
        });
    };
}

}

構成によるHTTPS

Springは、利用可能なプロパティソースからプロパティを読み取るHTTPまたはHTTPSポートを開くことができます。以下に示すように適切な構成を追加する場合は、HTTPポートを開いておくだけで十分です。

#default secured port (Spring will open it automatically)
server.port=8443
#additional HTTP port (will open it in UndertowConfig)
server.http.port=8080
#Open to the world
server.http.interface=0.0.0.0
#These settings tell Spring to open SSL port
server.ssl.keystore=file:${APP_BASE}/conf/server/ssl_selfsigned/server.keystore
server.ssl.key-store-password=xyz
server.ssl.key-password=xyz

手動セットアップによるHTTPS

必要に応じて、HTTPポートを開いたのと同じ方法で別のSSLポートを開くことができます。

 .addHttpsListener(ssl_port, httpInterface, getSSLContext());

これは、SSLコンテキストを作成する方法です

import javax.net.ssl.*;
import Java.io.InputStream;
import Java.nio.file.Files;
import Java.nio.file.Paths;
import Java.security.KeyStore;

public SSLContext getSSLContext() throws Exception
{
    return createSSLContext(loadKeyStore(serverKeystore,keyStorePassword),
            loadKeyStore(serverTruststore,trustStorePassword));

}


private SSLContext createSSLContext(final KeyStore keyStore,
                                    final KeyStore trustStore) throws Exception {

    KeyManager[] keyManagers;
    KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
    keyManagerFactory.init(keyStore, keyStorePassword.toCharArray());
    keyManagers = keyManagerFactory.getKeyManagers();

    TrustManager[] trustManagers;
    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
    trustManagerFactory.init(trustStore);
    trustManagers = trustManagerFactory.getTrustManagers();

    SSLContext sslContext;
    sslContext = SSLContext.getInstance("TLS");
    sslContext.init(keyManagers, trustManagers, null);

    return sslContext;
}


private static KeyStore loadKeyStore(final String storeLoc, final String storePw) throws Exception {
    InputStream stream = Files.newInputStream(Paths.get(storeLoc));
    if(stream == null) {
        throw new IllegalArgumentException("Could not load keystore");
    }
    try(InputStream is = stream) {
        KeyStore loadedKeystore = KeyStore.getInstance("JKS");
        loadedKeystore.load(is, storePw.toCharArray());
        return loadedKeystore;
    }
}
4
Stan Sokolov

別のSpringブート2.xソリューション:

private static final int HTTP_PORT = 80;
private static final int HTTPS_PORT = 443;
private static final String HTTP = "http";
private static final String USER_CONSTRAINT = "CONFIDENTIAL";

@Bean
public ServletWebServerFactory servletContainer() {
    TomcatServletWebServerFactory Tomcat = new TomcatServletWebServerFactory() {
        @Override
        protected void postProcessContext(Context context) {
            SecurityConstraint securityConstraint = new SecurityConstraint();
            securityConstraint.setUserConstraint(USER_CONSTRAINT);
            SecurityCollection collection = new SecurityCollection();
            collection.addPattern("/*");
            securityConstraint.addCollection(collection);
            context.addConstraint(securityConstraint);
        }
    };
    Tomcat.addAdditionalTomcatConnectors(redirectConnector());
    return Tomcat;
}

private Connector redirectConnector() {
    Connector connector = new Connector(
            TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
    connector.setScheme(HTTP);
    connector.setPort(HTTP_PORT);
    connector.setSecure(false);
    connector.setRedirectPort(HTTPS_PORT);
    return connector;
}

そして、プロパティで設定しますserver.port = 44

2
max

https://github.com/creactiviti/spring-boot-starter-acme をご覧ください。 LetsEncryptベースのSSL証明書の自動生成が非常に簡単になります。

READMEから:

  1. モジュールをpom.xmlファイルに依存関係として追加します。

  2. プロジェクトをビルドします。

  3. ターゲットマシンにデプロイし、ドメイン名がそのマシンのIPアドレスを指すようにします。 LetsEncryptは、このモジュールによって公開される http://your-domain/.well-known/acme-challenge/ {token}エンドポイントへのコールバックを行うことにより、ドメインの所有権を検証します。

  4. サーバーの$ PATHでopensslが使用可能であることを確認してください。

  5. Spring-boot-starter-acmeをアクティブにして証明書を生成するには、次を実行します。

    Sudo Java -Dserver.port=80 -Dacme.enabled=true -Dacme.domain-name=<YOUR_DOMAIN_NAME> -Dacme.accept-terms-of-service=true -jar mysecureapp-0.0.1-SNAPSHOT.jar

  6. コンソールで証明書が正常に生成されたことを確認してください。

  7. アプリケーションを停止し、生成された証明書を使用するように構成します。

    server.port=443 server.ssl.key-store=keystore.p12 server.ssl.key-store-password=password server.ssl.keyStoreType=PKCS12

1
acohen