2017-07-07 96 views
0

春天引導版本設置: 1.5.4.RELEASE春季啓動 - 密鑰存儲密碼的代碼

我目前有我的春天啓動應用程序的代碼中設置我的server.ssl.key-store-password的問題。我們將密碼存儲在金庫中,之前我通過-D屬性將其傳入。但是,這對我們來說不是一個理想的解決方案。

似乎簡單,下面的解決辦法是什麼我做:

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

按照Spring Boot Documentation這應該是罰款,因爲ServletConfig被的application.properties之前加載

不幸的是,Tomcat拒絕以這種方式設置server.ssl.key-store-password開始。從我所看到的,AbstractNestablePropertyAccessor構造了一個供給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中存儲保險庫密碼的'label',但如果我這樣做了,那麼在Spring啓動之前我無法訪問該標籤(無需手動解析application.yml,它自己的問題與多個配置文件)。

有沒有其他人遇到過這個問題的解決方案?也許我的做法是錯誤的,並且有一種更簡單的做事方式。

回答

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而不是新的ServerProperties,所以我們的密碼庫密碼Ssl已經在那裏設置了。這不會被覆蓋,因爲我們沒有在我們的application.yml中設置server.ssl.key-store-password

我們@AutowireEnvironment這樣我們就可以訪問了server.ssl.key-store-label屬性(我以前創建的),用它來裝載我們的實際server.ssl.key-store-password屬性,然後設置通過系統性能,以便它可以在其他地方的應用程序訪問。