原文連結:Spring Boot 如何同時支援 http 與 https 通路?
大多數項目要麼要求 https 協定來通路要麼直接用 http 協定,但有些項目就是這麼奇怪要求同時支援兩種協定。
此示例中使用Spring Boot 内置的 tomcat 伺服器,我拿到的 SSL 證書是 crt 類型的。所有首先需要将證書轉成 jks 類型的。
crt 轉 jks
# 轉p12
openssl pkcs12 -export -out keystore.pkcs12 -inkey nexus.key -in nexus.crt
# 這裡需要設定密碼
# 再将p12格式檔案轉為.jks格式:
keytool -v -importkeystore -srckeystore keystore.pkcs12 -srcstoretype PKCS12 -destkeystore
keystore.jks -deststoretype JKS
# 輸入上步設定的密碼并設定新密碼 可以和上一步一樣的密碼
複制
Windows 系統需要安裝 openssl 後才可以執行上述指令。
安裝
将生成的 jks 檔案放到項目的 resource 目錄下,開始配置 application.yml 檔案。
server:
port: 8888
custom:
# http 端口
httpPort: 9999
ssl:
key-store: classpath:keystore.jks
key-password: 123456
key-store-type: JKS
tomcat:
uri-encoding: utf-8
basedir: tmp
#
servlet:
context-path: /
複制
然後編寫 Https配置類:HttpConfig.java
import org.apache.catalina.connector.Connector;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Author: ChangXuan
* @Decription: 配置同時支援 HTTP 與 HTTPS 通路
* @Date: 19:39 2020/2/20
**/
@Configuration
public class HttpsConfig {
@Value("${server.custom.httpPort}")
private Integer httpPort;
@Bean
public ServletWebServerFactory serverFactory() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
tomcat.addAdditionalTomcatConnectors(createStandardConnector());
return tomcat;
}
/**
* 配置http
* @return
*/
private Connector createStandardConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setPort(httpPort);
return connector;
}
}
複制
注意事項
application.yml 中配置的 jks 檔案的目錄為 classpath ,classpath 指的是 target/classes 目錄。是以運作時如果報錯“找不到 jks 檔案”,就手動将 jks 檔案複制到此目錄下一份。