Spring Bootの組み込みTomcatインスタンスで動作するようにSpring Securityを設定しようとしています。これを行う基本的なサンプルはかなりありますが、私は彼らがやめたところで立ち往生しています-それらはHTTP(HTTPSではなく)で基本認証を行います。
Tomcat構成ファイル(server.xml
)にアクセスできる場合はおそらく動作させることができますが、Spring Bootは組み込みのTomcatインスタンスを使用するため(そうでなければ非常に便利です)、Tomcat構成ファイルにアクセスできません(少なくとも、私の知る限り)。
これにはapplication.properties
設定があるかもしれませんが、私はそれを追跡することができませんでした。 server.contextPath
のapplication.properties
フィールドへの参照を見たことがありますが、これは、Tomcatの設定ファイルの置換と関係があると思われます。それが関連していても、どこから始めればいいのかわかりません-私が見たTomcat SSL命令のすべては、ゼロから作成するのではなく、既存のserver.xml
ファイルの編集から始まります。
これはSpring Bootで行うことができますか(何らかの方法でserver.xml
のスニペットを指定するか、他の方法で)?そうでない場合、これを行う最も簡単な方法は何ですか? Spring BootのTomcatコンポーネントを除外する必要があるかもしれないことは理解していますが、可能であればそれを避けたいと思います。
これを行う方法があることがわかりましたが、複数のプロジェクトからソースコードを読むのに何時間もかかったので、「適切な」方法を見つけたかどうかはわかりませんが。言い換えれば、これは多くの馬鹿げた仕事かもしれません(しかし、うまくいきます)。
まず、組み込みTomcatのserver.xmlを取得する方法はありません。それを拡張したり置き換えたりすることはできません。これはプログラムで行う必要があります。
第二に、証明書情報をそのように設定できないため、「require_https」設定は役に立ちません。 doeshttpからhttpsへの転送を設定しますが、httpsを機能させる方法を提供しないため、転送は役に立ちません。ただし、httpsを機能させるdoesの下で使用します。
最初に、 埋め込みサーブレットコンテナサポートドキュメント で説明されているように、EmbeddedServletContainerFactory
を指定する必要があります。ドキュメントはJava向けですが、Groovyはほとんど同じように見えます。例で使用されている_@Value
_アノテーションを認識させることができませんでしたが、 groovyの場合、これを新しい.groovyファイルに配置し、spring
bootを起動するときにコマンドラインにそのファイルを含めるだけです。
これで、web.xmlの動作を変更できるように、そのコードで作成したTomcatEmbeddedServletContainerFactory
クラスをカスタマイズできると説明されていますが、これは事実ですが、私たちの目的にとっては、 _server.xml
_の動作を調整するために使用します。実際、クラスのソースを読み、それを埋め込みTomcatドキュメントと比較すると、これがそれを行う唯一の場所であることがわかります。興味深い関数はTomcatEmbeddedServletContainerFactory.addConnectorCustomizers()
です。これは、Javadocからはあまり見えないかもしれませんが、実際には、自分でカスタマイズするためのEmbedded Tomcatオブジェクトを提供します。単にTomcatConnectorCustomizer
の独自の実装を渡し、void customize(Connector con)
関数の特定のConnector
に必要なものを設定します。 Connector
でできることは10億ほどありますが、役に立つドキュメントは見つかりませんでしたが、この中にcreateConnector()
関数があります this guys personal Spring- embedded-Tomcatプロジェクト は非常に実用的なガイドです。私の実装は次のようになりました。
_package com.deepdownstudios.server
import org.springframework.boot.context.embedded.Tomcat.TomcatConnectorCustomizer
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory
import org.springframework.boot.context.embedded.Tomcat.TomcatEmbeddedServletContainerFactory
import org.Apache.catalina.connector.Connector;
import org.Apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.*
import org.springframework.stereotype.*
@Configuration
class MyConfiguration {
@Bean
public EmbeddedServletContainerFactory servletContainer() {
final int port = 8443;
final String keystoreFile = "/path/to/keystore"
final String keystorePass = "keystore-password"
final String keystoreType = "pkcs12"
final String keystoreProvider = "SunJSSE"
final String keystoreAlias = "Tomcat"
TomcatEmbeddedServletContainerFactory factory =
new TomcatEmbeddedServletContainerFactory(this.port);
factory.addConnectorCustomizers( new TomcatConnectorCustomizer() {
void customize(Connector con) {
Http11NioProtocol proto = (Http11NioProtocol) con.getProtocolHandler();
proto.setSSLEnabled(true);
con.setScheme("https");
con.setSecure(true);
proto.setKeystoreFile(keystoreFile);
proto.setKeystorePass(keystorePass);
proto.setKeystoreType(keystoreType);
proto.setProperty("keystoreProvider", keystoreProvider);
proto.setKeyAlias(keystoreAlias);
}
});
return factory;
}
}
_
Autowiringは、この実装を選択して実行します。壊れたキーストアファイルを修正したら(他で報告されている_-storetype pkcs12
_ではなく、_-storepass pkcs12
_でkeytoolを呼び出すようにしてください)、これは機能しました。また、テストなどの構成設定としてパラメーター(ポート、パスワードなど)を提供する方がはるかに優れています。Groovyで@Valueアノテーションを取得できる場合は、その可能性があります。
Spring Boot 1.2以降では、application.properties
またはapplication.yml
を使用してSSLを設定できます。 application.properties
の例を次に示します。
server.port = 8443
server.ssl.key-store = classpath:keystore.jks
server.ssl.key-store-password = secret
server.ssl.key-password = another-secret
application.yml
と同じこと:
server:
port: 8443
ssl:
key-store: classpath:keystore.jks
key-store-password: secret
key-password: another-secret
現在の参照ドキュメント へのリンクを次に示します。
外部キーストアの場合、「file:」をプレフィックスとして付けます
server.ssl.key-store=file:config/keystore
_connector customizer
_を実装したくない場合は、ライブラリをビルドしてインポートできます( https://github.com/ycavatars/spring-boot-https-kit )定義済みの_connector customizer
_を提供します。 READMEによると、キーストアを作成し、_connector.https.*
_を設定し、ライブラリをインポートして、@ComponentScan("org.ycavatars.sboot.kit")
を追加するだけです。その後、HTTPS接続ができます。