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.key
, certificate.crt
, ca_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.csr
, server.key
, STAR_yourDomain_com.crt
, STAR_yourDomain_com.ca-bundle
這 4 個檔案,只會用到 server.key
, STAR_yourDomain_com.crt
這兩個檔,指令也與 產生 Spring Boot 裡 Tomcat 必要的 jks
檔案 裡像說的一樣。
P12 憑證的產生與設定(下列是示範密碼, 運作在正式區時, 請自行修改)
- fullchain_and_key.p12 保護密碼:
yourPKCS12pass
- deststorepass 保護密碼:
yourStorePass
- 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
發佈留言