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でも使用しようとしています。助けていただければ幸いです!
プロパティを使用したスプリングブート構成では、1つのコネクタのみを構成できます。必要なのは複数のコネクタであり、そのためにはConfigurationクラスを作成する必要があります。の指示に従ってください
プロパティを介してhttpsを設定し、次にEmbeddedServletContainerCustomizerを介してhttpを設定する実用的な例を見つけることができます
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);
}
}
};
}
}
現在受け入れられている答えは完全に機能しますが、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
}
}
Spring Bootでは、構成によって1つのポートのみを開くことができます。 2番目のポートはプログラムで開く必要があります。
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);
});
};
}
}
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
必要に応じて、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;
}
}
別の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
https://github.com/creactiviti/spring-boot-starter-acme をご覧ください。 LetsEncryptベースのSSL証明書の自動生成が非常に簡単になります。
READMEから:
モジュールをpom.xmlファイルに依存関係として追加します。
プロジェクトをビルドします。
ターゲットマシンにデプロイし、ドメイン名がそのマシンのIPアドレスを指すようにします。 LetsEncryptは、このモジュールによって公開される http://your-domain/.well-known/acme-challenge/ {token}エンドポイントへのコールバックを行うことにより、ドメインの所有権を検証します。
サーバーの$ PATHでopensslが使用可能であることを確認してください。
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
コンソールで証明書が正常に生成されたことを確認してください。
アプリケーションを停止し、生成された証明書を使用するように構成します。
server.port=443 server.ssl.key-store=keystore.p12 server.ssl.key-store-password=password server.ssl.keyStoreType=PKCS12