一、前言
在互聯網時代,隱私和安全問題愈發突出,SpringBoot Https實現正是應對這一趨勢的重要解決方案。通過本文,你將學到如下內容:
1. Https與Http的區別
2. Https的作用及優缺點
3. SpringBoot Https實現方法和步驟
二、Https介紹
Https(Hyper Text Transfer Protocol over Secure Socket Layer)即在HTTP上添加SSL層,將HTTP包裝起來,從而保護數據傳輸過程中的隱私和安全,實現了加密通信和身份認證。
相較於Http,Https的優點有:
1. 數據傳輸過程中的隱私和安全更加可靠;
2. 可以防止中間人攻擊(Man-in-the-Middle Attack);
3. 能夠校驗證書,確保服務器與客戶端的真實性和一致性;
4. 能夠對SEO產生積極影響。
三、SpringBoot Https實現步驟
1. 生成證書和私鑰
使用Java提供的keytool工具生成證書和私鑰。示例命令:
keytool -genkeypair -alias tomcat \ -keyalg RSA -keysize 2048 \ -keystore your_keystore_name.jks \ -validity 3650
其中,tomcat代表別名,keysize代表密鑰長度,keystore代表證書存儲路徑。根據實際情況進行修改即可。
2. 配置application.properties
添加以下內容:
server.port=443 server.ssl.key-store=classpath:your_keystore_name.jks server.ssl.key-store-password=your_keystore_password server.ssl.keyStoreType=JKS server.ssl.keyAlias=tomcat
其中,port指定了服務器的端口號為443,key-store-path指定生成的證書路徑,key-store-password指定證書密碼,key-store-type指定證書類型,keyAlias指定了生成證書時的別名。
3. 修改啟動類
在啟動類中添加@EnableAutoConfiguration註解,並修改configure方法為下列代碼:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().permitAll()
.and().csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and().httpBasic().disable()
.headers().cacheControl().disable();
}
在這裡,我們允許所有請求都被通過,每次登錄的session不需要管理,禁用了HTTP的基本認證驗證,並禁用了響應頭信息的緩存控制。
四、開啟Https驗證
通過以上配置後,啟動SpringBoot項目默認為http,在訪問https時會提示Http請求無法訪問。我們還需要為SpringBoot添加Https支持,使請求能夠被Https處理。
在啟動類Application的main方法中添加如下內容即可啟用Https驗證:
Ssl ssl = new Ssl();
ssl.setKeyStore("classpath:your_keystore_name.jks");
ssl.setKeyStorePassword("your_keystore_password");
ssl.setKeyAlias("tomcat");
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
tomcat.addAdditionalTomcatConnectors(createSslConnector());
tomcat.setSsl(ssl);
return tomcat;
}
private Connector createSslConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
try {
File truststore = new ClassPathResource("your_keystore_name.jks").getFile();
connector.setScheme("https");
connector.setSecure(true);
connector.setPort(8443);
protocol.setSSLEnabled(true);
protocol.setKeystoreFile(truststore.getAbsolutePath());
protocol.setKeystorePass("your_keystore_password");
protocol.setKeyAlias("tomcat");
return connector;
}
catch (IOException ex) {
throw new IllegalStateException("can't access truststore: " + ex);
}
}
五、完整代碼示例
以下為完整的SpringBoot Https實現代碼示例:
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
Ssl ssl = new Ssl();
ssl.setKeyStore("classpath:your_keystore_name.jks");
ssl.setKeyStorePassword("your_keystore_password");
ssl.setKeyAlias("tomcat");
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
tomcat.addAdditionalTomcatConnectors(createSslConnector());
tomcat.setSsl(ssl);
return builder.sources(Application.class).web(WebApplicationType.SERVLET)
.bannerMode(Banner.Mode.OFF)
.properties("spring.config.additional-location=classpath:/application-production.properties")
.properties("spring.output.ansi.enabled=ALWAYS")
.properties("server.port=80")
.properties("server.http.port=80")
.properties("server.https.port=443")
.properties("server.ssl.enabled=true")
.properties("server.ssl.client-auth=none")
.properties("server.ssl.key-store=classpath:your_keystore_name.jks")
.properties("server.ssl.key-store-password=your_keystore_password")
.properties("server.ssl.keyStoreType=JKS")
.properties("server.ssl.keyAlias=tomcat")
.serverCustomizers((TomcatServletWebServerFactory factory) -> {
factory.addConnectorCustomizers((connector) -> {
connector.setProperty("relaxedQueryChars", "|{}[]");
connector.setParseBodyMethods("POST,PUT,DELETE");
connector.setProperty("relaxedPathChars", "_[]{}|");
});
});
}
private Connector createSslConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
try {
File truststore = new ClassPathResource("your_keystore_name.jks").getFile();
connector.setScheme("https");
connector.setSecure(true);
connector.setPort(443);
protocol.setSSLEnabled(true);
protocol.setKeystoreFile(truststore.getAbsolutePath());
protocol.setKeystorePass("your_keystore_password");
protocol.setKeyAlias("tomcat");
return connector;
}
catch (IOException ex) {
throw new IllegalStateException("can't access truststore: " + ex);
}
}
}
六、小結
通過本文,我們了解到Https的優點和作用,並詳細介紹了SpringBoot中實現Https的步驟和代碼示例。對於項目安全和隱私保護的需求,開啟Https是一種可行的解決方案。
原創文章,作者:HXEYO,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/316321.html
微信掃一掃
支付寶掃一掃