Spring Bootの組み込みTomcatでHTTPSに対応する方法メモ。
まずはHello Worldプロジェクトを作る。手順はこれと同じ。
App.java修正
App.java
にちょっと追記。次に説明するAppConfig.java
の設定を自動で読み込むために@ComponentScan
を追加する。
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@EnableAutoConfiguration
@ComponentScan // ここ追加
public class App {
@RequestMapping("/")
String home() {
return "Hello World!";
}
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
JavaConfig作成
次にBean定義JavaConfig作成。
package com.example;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.ResourceUtils;
import java.io.FileNotFoundException;
@Configuration
public class AppConfig {
@Value("${keystore.file:keystore.p12}")
String keystoreFile;
@Value("${keystore.password:foobar}")
String keystorePassword;
@Bean
public EmbeddedServletContainerFactory servletContainer() throws FileNotFoundException {
TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
String absoluteKeystoreFile = ResourceUtils.getFile(keystoreFile).getAbsolutePath();
factory.addConnectorCustomizers((connector) -> {
connector.setPort(8443);
connector.setSecure(true);
connector.setScheme("https");
Http11NioProtocol proto = (Http11NioProtocol) connector.getProtocolHandler();
proto.setSSLEnabled(true);
proto.setKeystoreFile(absoluteKeystoreFile);
proto.setKeystorePass(keystorePassword);
proto.setKeystoreType("PKCS12");
proto.setKeyAlias("tomcat");
});
return factory;
}
}
組み込みコンテナの変更方法はここを参考にした。
Keystore
$ keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
パスワードはJavaConfigの通り、foobarにした。
実行
(途中略)
2014-06-12 23:58:45.869 INFO 4150 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8443/https
2014-06-12 23:58:45.872 INFO 4150 --- [ main] com.example.App : Started App in 5.605 seconds (JVM running for 6.435)
8443番でHTTPSが!
https://localhost:8443 にアクセス。
できた!
設定値を外から変更
ビルドして実行可能jarにした後、--プロパティ名
で@Value
で設定したプロパティを変更可能。(システムプロパティや環境変数でもOKなはず)
$ mvn package
$ java -jar target/hajiboot-1.0.0-SNAPSHOT.jar --keystore.password=hoge
このサンプルを参考にしました。
2014-06-23追記 本家ドキュメントに書いてあった・・