Spring Boot中實現HTTPS for localhost


Spring Boot中實現HTTPS for localhost

當今時代,幾乎所有能訪問的網站都是受HTTPS保護的,使用HTTPS保護您的服務器也就意味着您無法從非HTTPS的服務器發送請求到此服務器。
這對使用本地開發環境的開發人員來說是一個問題,因為這些本地開發環境都是運行在http://localhost下的。
本文主要介紹在Spring Boot項目中,localhost如何實現HTTPS。

創建安全套接層(SSL)證書

SSL 證書就是遵守 SSL 安全套接層協議的服務器數字證書,由瀏覽器中“受信任的根證書頒發機構”在驗證服務器身份后頒發,具有網站身份驗證和加密傳輸雙重功能。可確保互聯網連接安全,保護兩個系統之間發送的任何敏感數據,防止網絡犯罪分子讀取和修改任何傳輸信息。
如果您能使用 https:// 來訪問某個網站,就表示此網站是部署了SSL證書。一般來講,如果此網站部署了SSL證書,則在需要加密的頁面會自動從 http:// 變為 https:// ,如果沒有變,你認為此頁面應該加密,您也可以嘗試直接手動在瀏覽器地址欄的http后面加上一個英文字母“ s ”后回車,如果能正常訪問並出現安全鎖,則表明此網站實際上是部署了SSL證書,只是此頁面沒有做 https:// 鏈接;如果不能訪問,則表明此網站沒有部署 SSL證書。
如果 SSL 證書不是由瀏覽器中“受信任的根證書頒發機構”頒發的,則瀏覽器會有安全警告。

獲取SSL證書的途徑

  • 通過OpenSSL生成證書
  • 通過keytool簽名
  • 從SSL證書授權中心購買

前兩種方法都試過了,網上也看到兩篇很有用的博客——localhost 添加 SSL 證書 Springboot配置使用ssl

通過OpenSSL生成證書

  1. 首先安裝OpenSSL,默認目錄安裝即可。下載地址

  2. 新建配置文件localhost.cnf,文件內容如下

    [dn]
    CN=localhost
    
    [req]
    distinguished_name = dn
    
    [EXT]
    subjectAltName=DNS:localhost
    keyUsage=digitalSignature
    extendedKeyUsage=serverAuth
    
  3. 以管理員身份進入命令行界面
    假設 OpenSSL 的安裝位置為 ‘C:\Program Files (x86)\GnuWin32’,使用cd命令進入 ‘C:\Program Files (x86)\GnuWin32\bin’
    然后執行命令

.\openssl req -x509 -out localhost.crt -keyout localhost.key -newkey rsa:2048 -nodes -sha256 -subj ‘/CN=localhost’ -extensions EXT -config {localhost.cnf文件目錄}

證書就會生成成功,如下圖所示。
在這里插入圖片描述

  1. 此時再打開chrome瀏覽器,點擊設置,找到證書管理,import剛才生成的證書即可。

在這里插入圖片描述

在這里插入圖片描述

通過keytool簽名

keytool是一個證書管理工具,可以生成自簽名證書,個人認為通過keytool生成更便捷一些。
1.在JDK中輸入如下命令。

keytool -genkey -alias tomcat -keyalg RSA -keystore tomcat.keystore

在這里插入圖片描述

2.將tomcat.keystore拷貝到項目根目錄下

3.配置application.yml

server:
  port: 8443
  servlet:
    context-path: '/identity'
  ssl:
    key-store: tomcat.keystore
    key-store-password: 123456
    key-store-type: JKS
    key-alias: tomcat

此時啟動項目就可以直接訪問https://localhost:8443/,但尚未實現自動跳轉到HTTPS。

4.在運行主類中加入如下代碼,即可實現自動跳轉。
此時你在瀏覽器輸入http://localhost:8081/identity/login訪問,會自動跳轉到https://localhost:8443/identity/login

@Bean
  public Connector connector(){
    Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
    connector.setScheme("http");
    connector.setPort(8081);
    connector.setSecure(false);
    connector.setRedirectPort(8443);
    return connector;
  }

  @Bean
  public TomcatServletWebServerFactory tomcatServletWebServerFactory(Connector connector){
    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;
  }

總結

本文主要是結合個人實踐,探討了Spring Boot中實現HTTPS for localhost,以及獲取SSL證書的兩種方式。
希望能對大家有所幫助~ 有問題歡迎留言交流,不足之處還請多多指正。


免責聲明!

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



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