簡體   English   中英

配置嵌入式Tomcat7以使用嵌入在可執行jar中的keystorefile

[英]configure embedded Tomcat7 to use keystorefile embedded in executable jar

我已經設法配置我的嵌入式tomcat使用密鑰庫文件,當我從eclipse執行項目時它可以工作。

代碼很簡單:

...
String keystore = new File(MyServer.class.getResource("/keystore").toURI()).toPath().toString();
httpsConnector.setAttribute("keystoreFile",keystore);
...

文件keystore位於添加到構建路徑的源目錄中。

將項目導出到可執行jar后,我可以驗證jar根目錄中是否存在keyfile

但在執行jar時,我收到此錯誤:

Exception in thread "main" java.lang.IllegalArgumentException: URI is not hierarchical

所以我認為,我無法使用httpsConnector.setAttribute("keystoreFile",...)配置密鑰httpsConnector.setAttribute("keystoreFile",...) 還有另一種配置方式嗎? 我真的不想在臨時目錄中復制密鑰文件並從那里引用它。

我真的不想在臨時目錄中復制密鑰文件並從那里引用它。

我很同情,但看起來你將不得不這樣做。 可以從任何類型的輸入流加載Java密鑰庫(請參閱Keystore.load ),因此您可以認為可以從jar文件中的資源加載密鑰庫。 但是,如果在Tomcat 7源代碼中搜索字符串“ks.load”,您將看到它始終將keystoreFile屬性解釋為File的名稱,並創建一個FileInputStream,然后傳遞給ks.load。

因此,有必要創建包含密鑰庫的臨時文件,並將此文件的位置作為keystoreFile屬性傳遞。

順便說一句 - 如果你打算分發這個jar並且願意將它保密,那么你嵌入密鑰庫的方法可能就行了。

但是,如果您計划將此jar分發到多個站點,則每個站點的安全性都基於相同的私鑰。 此外,任何有權訪問jar文件的人都可以提取私鑰,然后可以竊聽或者中間人攻擊您的所有站點。

通常,最好是安裝過程需要由站點管理員生成新的私鑰和證書(即使它只是一個自簽名證書)。 這樣每個密鑰都是不同的,破壞網站的唯一方法是訪問該服務器密鑰庫和密碼。

這可能是一個舊帖子,但我遇到了同樣的問題,並沒有在網上找到解決方案。 所以我想分享我的所作所為。

就我而言,我需要兩個帶有自簽名證書的端口。 除了在application.yml中配置的那個,另一個端口在主條目中配置。

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public ServletWebServerFactory servletContainer() throws IOException
    {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        tomcat.addAdditionalTomcatConnectors(additionalConnector());
        return tomcat;
    }


    private Connector additionalConnector() throws IOException
    {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("https");
        connector.setPort(8088);
        ...

        URL keystore = new ClassPathResource("keystore.jks").getURL();
        connector.setAttribute("keystoreFile", keystore.toExternalForm());
        return connector;
    }
}

使用URL,mvn spring-boot:運行並運行jar工作,可以正常加載密鑰庫。

我使用的是spring-boot 2.0.1.RELEASE和tomcat 8.5.29

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM