2017-07-07 23 views
0

春ブートバージョンのコードで設定したキーストアパスワード: 1.5.4.RELEASE春ブーツ -

私は現在、私の春のブートアプリケーションのコードの中に私のserver.ssl.key-store-passwordを設定すると問題を抱えています。私たちはパスワードを保管庫に保管しており、以前は-Dのプロパティでパスワードを渡していました。しかし、これは私たちにとって理想的な解決策ではありません。

ソリューションは簡単に見えた、と下の私がやったことです:ServletConfigapplication.propertiesをロードされているよう

@Bean 
public ServletContextInitializer initializer() { 
    final String keyStorePassword; 
    // ... Get Password 
    return servletContext -> servletContext.setInitParameter("server.ssl.key-store-password", keyStorePassword); 
} 

Spring Boot Documentationによれば、これは、問題ないはずです。

残念ながら、Tomcatはこのようにしてserver.ssl.key-store-passwordのセットを開始することを拒否します。私が見ることができるように、AbstractNestablePropertyAccessororg.springframework.boot.context.embedded.Sslオブジェクトを構成し、Tomcatに供給され、キーストアを構築するために使用されます。これはSpringApplication.run()の間に行われます。これは明らかに、ServletConfig beanの構築前です。

だから、私はコンテキストをリフレッシュする必要があるようです(私が理解していることは、それを破壊/再作成することです)、別のアプローチを見つける必要があります。これはしかし、独自の問題を抱えている

public static void main(String[] args) { 
    String keyStorePassword = getKeystorePassword(); 
    HashMap<String, Object> props = new HashMap<>(); 
    props.put("server.ssl.key-store-password", keyStorePassword); 
    new SpringApplicationBuilder() 
      .sources(TesterApplication.class) 
      .properties(props) 
      .run(args); 
} 

:私はのようなものを使用してプロパティを設定することができます。私は、私のapplication.ymlにボールトのパスワードの 'ラベル'を保存することを考えていましたが、そうした場合、Springが起動する前にそのラベルにアクセスすることはできません(手動で、それ自身の複数のプロファイルの問題)。

他に誰かがこの問題の解決策を見つけましたか?おそらく私のアプローチは間違っていて、もっと簡単な方法があります。

答えて

0

右に分かりました。間違っていたここ

@Component 
public class KeystoreInit { 

    private final Environment environment; 

    @Autowired 
    public KeystoreInit(Environment environment) { 
     this.environment = environment; 
    } 

    @Bean 
    public ServerProperties serverProperties() { 
     final ServerProperties serverProperties = new ServerProperties(); 
     final Ssl ssl = new Ssl(); 
     final String keystorePassword = getKeystorePassword(); 
     ssl.setKeyPassword(keystorePassword); 
     System.setProperty("server.ssl.key-store-password", keystorePassword); 
     serverProperties.setSsl(ssl); 
     return serverProperties; 
    } 

    private String getKeystorePassword() { 
     // ... 
    } 

} 

アイデアは、我々は最初のServerProperties Beanを作成しているということです。私がやるべきことは以下の通りでした。このBeanは新しいServerPropertiesの代わりにロードされるため、キーストアのパスワードを持つSslが既に設定されています。これは、にserver.ssl.key-store-passwordを設定していないため、オーバーライドされません。

我々は、(私が以前に作成していた)server.ssl.key-store-labelプロパティをアクセスし、当社の実際のserver.ssl.key-store-passwordプロパティをロードするためにそれを使用し、それをアプリケーション内の別の場所にアクセスできるようにシステムプロパティを経由していることを設定することができるよう、私たちはEnvironment@Autowire