一、前言
在互聯網時代,隱私和安全問題愈發突出,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-tw/n/316321.html