2020 年 2 月 24 日 星期一

IT Skills 波林

Polin WEI – 資訊工作者的技術手札

Spring Boot 配置 SSL 憑證的設定

2 min read
高雄大魚

Spring Boot 配置 SSL 憑證的設定

 

文章中 Spring Boot 客製化 登入 ( Login ) 與 認證 (Authenticate) 機制 建立了一個需要認證的網站,既然要輸入帳號/密碼,那麼就應該要有 SSL 憑證的保護。Spring Boot 在套件 spring-boot-starter-web 裡,已有配置 Tomcat 伺服器,可利用 使用 Let’s Encrypt 取得 SSL 來設定 HTTPS 並強制使用 SSL 安全加密協定 裡申請的免費SSL憑證,來強化網站安全。

 

  1. 產生 Spring Boot 裡 Tomcat 必要的 jks 檔案
  2. Spring boot 裡 application.properties 檔案內容
  3. Spring Boot 讓 HTTP 強制轉換到 HTTPS
  4. keytool Options 參數說明

 

  • 產生 Spring Boot 裡 Tomcat 必要的 jks 檔案

要產生 Spring Boot 裡 Tomcat 必要的 jks 檔案,需要 利用 Apache 的 Virtual Host 功能來架設虛擬網站 文章提到 XAMPP 裡的 openssl 協助,以及 Spring Boot 在 Eclipse 的安裝與設定 裡的 OpenJDK ,從 使用 Let’s Encrypt 取得 SSL 來設定 HTTPS 並強制使用 SSL 安全加密協定 取的免費SSL憑證,會有三個檔案:private.key, certificate.crt, ca_bundle.crt ,使用的指令如下。

set JAVA_HOME=V:\Openjdk\jdk-8u232-x64
set PATH=.;%JAVA_HOME%\jre\bin;%JAVA_HOME%\bin;V:\gradle\bin;W:\xampp\apache\bin;

openssl pkcs12 -export -in certificate.crt -inkey private.key -out fullchain_and_key.p12 -name tomcat
keytool -importkeystore -deststorepass yourJKSpass -destkeypass yourKeyPass -destkeystore AppsDSKeyStore.jks -srckeystore fullchain_and_key.p12 -srcstoretype pkcs12 -srcstorepass yourPKCS12pass -alias tomcat

openssl 這行輸入後,會要求輸入 key-store-password ,用來保護產生出來的檔案 fullchain_and_key.p12 ,這裡示範輸入的是 yourPKCS12pass

openssl pkcs12 -export -in certificate.crt -inkey private.key -out fullchain_and_key.p12 -name tomcat

 

keytool 這行裡的參數 -srcstorepass 要接這個密碼yourPKCS12pass,至於第一個參數 -deststorepass 的示範密碼:yourJKSpass ,是要對應 Spring boot 裡 application.properties 的參數 server.ssl.key-store-password ;第二個參數 -destkeypass 示範密碼:yourKeyPass,要對應 application.properties 的參數 server.ssl.key-password 。這時候會產生出 AppsDSKeyStore.jks 這個檔案,要將這個檔案放在 src/main/resources 目錄下。

keytool -importkeystore -deststorepass yourJKSpass -destkeypass yourKeyPass -destkeystore AppsDSKeyStore.jks -srckeystore fullchain_and_key.p12 -srcstoretype pkcs12 -srcstorepass yourPKCS12pass -alias tomcat

 

  • Spring boot 裡 application.properties 檔案內容

將 application.properties 裡的參數設置好後,重新起動 Spring Boot ,就可以用 HTTPS (443)來登入了。

server.port=443

# ===============================
# SSL
# ===============================
server.ssl.key-store = classpath:AppsDSKeyStore.jks
server.ssl.key-store-password = yourJKSpass
server.ssl.key-password = yourKeyPass

 

  • Spring Boot 讓 HTTP 強制轉換到 HTTPS

但是使用 HTTP (80) 會說此服務不存在,在 Spring Boot 裡也可以設定像 使用 Let’s Encrypt 取得 SSL 來設定 HTTPS 並強制使用 SSL 安全加密協定 來讓 HTTP 強制轉換到 HTTPS。增加一個 TomcatConfig.java 設定檔,來執行這項任務吧。

@Configuration
public class TomcatConfig {
 
 @Value("${server.port}")
 private Integer serverPort;

 @Bean
    public TomcatServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory(){
            @Override
            protected void postProcessContext(Context context){
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);

            }
        };
        tomcat.addAdditionalTomcatConnectors(createHttpConnector());
        return tomcat;
    }

    private Connector createHttpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setSecure(false);
        connector.setPort(80);
        connector.setRedirectPort(serverPort);
        return connector;
    }
}

這樣就可以讓 HTTP 強制轉換到 HTTPS了。

 

順帶一提,若不想用免費的 SSL ,而向 Comodo 申請 Wildcard SSL certificates 憑證時,手邊上應該會有 server.csr, server.key, STAR_yourDomain_com.crt, STAR_yourDomain_com.ca-bundle 這 4 個檔案,只會用到 server.key, STAR_yourDomain_com.crt這兩個檔,指令也與 產生 Spring Boot 裡 Tomcat 必要的 jks 檔案 裡像說的一樣。

 

附帶 keytool Options 參數的說明:

Options:

 -srckeystore <srckeystore>            source keystore name
 -destkeystore <destkeystore>          destination keystore name
 -srcstoretype <srcstoretype>          source keystore type
 -deststoretype <deststoretype>        destination keystore type
 -srcstorepass <arg>                   source keystore password
 -deststorepass <arg>                  destination keystore password
 -srcprotected                         source keystore password protected
 -srcprovidername <srcprovidername>    source keystore provider name
 -destprovidername <destprovidername>  destination keystore provider name
 -srcalias <srcalias>                  source alias
 -destalias <destalias>                destination alias
 -srckeypass <arg>                     source key password
 -destkeypass <arg>                    destination key password
 -noprompt                             do not prompt
 -providerclass <providerclass>        provider class name
 -providerarg <arg>                    provider argument
 -providerpath <pathlist>              provider classpath
 -v                                    verbose output

 

 

Copyright © All rights reserved. | Newsphere by AF themes.