Spring Boot 配置 SSL 憑證 jks & p12 的設定

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

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

要產生 Spring Boot 裡 Tomcat 必要的 jks 檔案,需要 利用 Apache 的 Virtual Host 功能來架設虛擬網站 文章提到 XAMPP 裡的 openssl 協助,以及 Spring Boot 在 Eclipse 的安裝與設定 裡的 OpenJDK ,從 使用 Cloudflare 的SSL憑證並整合CDN 取的免費SSL憑證,會有三個檔案:private.keycertificate.crtca_bundle.crt ,使用的指令如下。

JKS 憑證的產生與設定

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 裡也可以設定像 使用 Cloudflare 的SSL憑證並整合CDN 來讓 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.csrserver.keySTAR_yourDomain_com.crtSTAR_yourDomain_com.ca-bundle 這 4 個檔案,只會用到 server.keySTAR_yourDomain_com.crt這兩個檔,指令也與 產生 Spring Boot 裡 Tomcat 必要的 jks 檔案 裡像說的一樣。

P12 憑證的產生與設定(下列是示範密碼, 運作在正式區時, 請自行修改)

  1. fullchain_and_key.p12 保護密碼: yourPKCS12pass
  2. deststorepass 保護密碼: yourStorePass
  3. destkeypass 保護密碼: yourKeyPass
set JAVA_HOME=V:\Openjdk\jdk-8u232-x64
set PATH=.;%JAVA_HOME%\jre\bin;%JAVA_HOME%\bin;V:\gradle\bin;W:\xampp\apache\bin;

# 產生 fullchain_and_key.p12 的密碼: yourPKCS12pass
openssl pkcs12 -export -in STAR_yourDomain_com.crt -inkey server.key -out fullchain_and_key.p12 -name tomcat

# 產生 AppsDSKeyStore.jks
keytool -importkeystore -deststorepass yourStorePass -destkeypass yourKeyPass -destkeystore AppsDSKeyStore.jks -srckeystore fullchain_and_key.p12 -srcstoretype pkcs12 -srcstorepass yourPKCS12pass -alias tomcat

#  AppsDSKeyStore.jks 轉成 AppsDSKeyStore.p12
keytool -importkeystore -srckeystore AppsDSKeyStore.jks -destkeystore AppsDSKeyStore.p12 -srcstoretype JKS -deststoretype PKCS12 -deststorepass yourStorePass -destkeypass yourKeyPass

在 application.properties 的設定變更如下

# ===============================
# SSL: Comodo - Wildcard SSL certificates
# PKCS12  SSL設定方法
# ===============================
server.ssl.key-store = classpath:AppsDSKeyStore.p12
server.ssl.key-store-password = yourStorePass
server.ssl.keyStoreType=PKCS12

附帶 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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *