web-dev-qa-db-ja.com

Spring BootおよびTomcatで.keystoreファイルを指定するにはどうすればよいですか?

Spring Bootの組み込みTomcatインスタンスで動作するようにSpring Securityを設定しようとしています。これを行う基本的なサンプルはかなりありますが、私は彼らがやめたところで立ち往生しています-それらはHTTP(HTTPSではなく)で基本認証を行います。

Tomcat構成ファイル(server.xml)にアクセスできる場合はおそらく動作させることができますが、Spring Bootは組み込みのTomcatインスタンスを使用するため(そうでなければ非常に便利です)、Tomcat構成ファイルにアクセスできません(少なくとも、私の知る限り)。

これにはapplication.properties設定があるかもしれませんが、私はそれを追跡することができませんでした。 server.contextPathapplication.propertiesフィールドへの参照を見たことがありますが、これは、Tomcatの設定ファイルの置換と関係があると思われます。それが関連していても、どこから始めればいいのかわかりません-私が見たTomcat SSL命令のすべては、ゼロから作成するのではなく、既存のserver.xmlファイルの編集から始まります。

これはSpring Bootで行うことができますか(何らかの方法でserver.xmlのスニペットを指定するか、他の方法で)?そうでない場合、これを行う最も簡単な方法は何ですか? Spring BootのTomcatコンポーネントを除外する必要があるかもしれないことは理解していますが、可能であればそれを避けたいと思います。

42
Dave

これを行う方法があることがわかりましたが、複数のプロジェクトからソースコードを読むのに何時間もかかったので、「適切な」方法を見つけたかどうかはわかりませんが。言い換えれば、これは多くの馬鹿げた仕事かもしれません(しかし、うまくいきます)。

まず、組み込み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アノテーションを取得できる場合は、その可能性があります。

18
Dave

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

現在の参照ドキュメント へのリンクを次に示します。

57
Willie Wheeler

外部キーストアの場合、「file:」をプレフィックスとして付けます

server.ssl.key-store=file:config/keystore 
11
pma

_connector customizer_を実装したくない場合は、ライブラリをビルドしてインポートできます( https://github.com/ycavatars/spring-boot-https-kit )定義済みの_connector customizer_を提供します。 READMEによると、キーストアを作成し、_connector.https.*_を設定し、ライブラリをインポートして、@ComponentScan("org.ycavatars.sboot.kit")を追加するだけです。その後、HTTPS接続ができます。

0
guest