Spring Boot配置SSL實現https請求


Spring Boot配置SSL實現https請求

1. 生成SSL證書

  • 專業的SSL證書較為昂貴,可以在騰訊雲或者阿里雲上申請免費的SSL證書。
  • 如果只是做簡單的demo,可以使用java自帶的keytool工具生成SSL證書。

2. 使用keytool工具生成SSL證書

以windows系統為例(如果是linux系統,將keytool.exe替換為keytool即可),在終端輸入

keytool.exe -genkey -alias test -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore test.p12 -validity 3650

參數解釋

-genkey: 生成SSL證書
-alias: 證書別名
-storetype: 秘鑰倉庫類型
-keyalg: 生成證書算法
-keysize: 證書大小
-keystore: 生成證書保存路徑
-validity: 證書有效期

注意在終端輸入生成SSL命令后,“您的名字和姓氏是什么?”這一項需要設置為你的域名,本地測試的話便是localhost,其余選項可以忽略。

3. Spring Boot項目配置SSL

在配置文件application.yml中添加如下內容

server:
#  配置端口號,https默認端口號為443,如果443端口被占用,將占用443端口的進程殺死
  port: 443
#  配置ssl證書
  ssl:
#    SSL證書test.p12與application.yml放在同級目錄下
    key-store: classpath:test.p12
    key-store-password: 123456
    keyStoreType: PKCS12
    keyAlias: test

4. 測試SSL是否配置成功

創建HelloController

@RestController
@CrossOrigin(origins = "*")
public class HelloController {

    @GetMapping(value = "/hello")
    public String sayHello() {
        return "Hello World!";
    }

}

使用瀏覽器訪問https://localhost/hello ,看是否正確響應
(第一次訪問時,瀏覽器會警告,這是因為自己生成的SSL證書不被瀏覽器認可)。

如果出錯:檢查application.yml中端口號是否為443,檢查443端口是否被其他進程占用。

5. http請求自動轉換為https請求

修改入口類HttpsApplication,此配置方式需要SpringBoot2.0以上

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;


@SpringBootApplication
public class HttpsApplication {

    public static void main(String[] args) {
        SpringApplication.run(HttpsApplication.class, args);
    }

    @Bean
    public Connector connector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        // 捕獲http請求,並將其重定向到443端口
        connector.setScheme("http");
        connector.setPort(80);
        connector.setSecure(false);
        connector.setRedirectPort(443);
        return connector;
    }

    @Bean
    public TomcatServletWebServerFactory servletContainer() {
        // 對http請求添加安全性約束,將其轉換為https請求
        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(connector());
        return tomcat;
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM