Springboot 系列(十四)迅速啟用 HTTPS 加密你的網站

  • 2019 年 10 月 22 日
  • 筆記

1. 獲取 HTTPS 證書

正常情況下 HTTPS 證書需要從證書授權中心獲得,這樣獲得的證書才具有公信力,也會被各種瀏覽器客戶端所認可。常見的證書品牌如 Symantec,GeoTrustm,TrustAsia,Symantec 等。不過在 Springboot 的 HTTPS 實驗中就沒有必要去申請了,我們可以使用 Java 自帶的 keytool 生成 HTTPS 證書。

查看 keytool 工具使用說明。

D:>keytool  密鑰和證書管理工具  命令:   -certreq            生成證書請求   -changealias        更改條目的別名   -delete             刪除條目   -exportcert         導出證書   -genkeypair         生成密鑰對   -genseckey          生成密鑰   -gencert            根據證書請求生成證書   -importcert         導入證書或證書鏈   -importpass         導入口令   -importkeystore     從其他密鑰庫導入一個或所有條目   -keypasswd          更改條目的密鑰口令   -list               列出密鑰庫中的條目   -printcert          列印證書內容   -printcertreq       列印證書請求的內容   -printcrl           列印 CRL 文件的內容   -storepasswd        更改密鑰庫的存儲口令    使用 "keytool -command_name -help" 獲取 command_name 的用法    D:>keytool -genkeypair --help  keytool -genkeypair [OPTION]...  生成密鑰對  選項:   -alias <alias>                  要處理的條目的別名   -keyalg <keyalg>                密鑰演算法名稱   -keysize <keysize>              密鑰位大小   -sigalg <sigalg>                簽名演算法名稱   -destalias <destalias>          目標別名   -dname <dname>                  唯一判別名   -startdate <startdate>          證書有效期開始日期/時間   -ext <value>                    X.509 擴展   -validity <valDays>             有效天數   -keypass <arg>                  密鑰口令   -keystore <keystore>            密鑰庫名稱   -storepass <arg>                密鑰庫口令   -storetype <storetype>          密鑰庫類型   -providername <providername>    提供方名稱   -providerclass <providerclass>  提供方類名   -providerarg <arg>              提供方參數   -providerpath <pathlist>        提供方類路徑   -v                              詳細輸出   -protected                      通過受保護的機制的口令

通過上面的 keytool ,我們生成自己的自簽名證書。

D:>keytool -genkeypair -alias tomcat_https -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -keystore d:/tomcat_https.keystore -storepass 123456  您的名字與姓氏是什麼?    [Unknown]:  darcy  您的組織單位名稱是什麼?    [Unknown]:  codingme  您的組織名稱是什麼?    [Unknown]:  codingme  您所在的城市或區域名稱是什麼?    [Unknown]:  ShangHai  您所在的省/市/自治區名稱是什麼?    [Unknown]:  ShangHai  該單位的雙字母國家/地區程式碼是什麼?    [Unknown]:  ZN  CN=darcy, OU=codingme, O=codingme, L=ShangHai, ST=ShangHai, C=ZN是否正確?    [否]:  y  D:>

這時候已經在我們指定的位置下生成了證書文件,如果需要查看證書資訊,可以使用 keytool 的 list 命令,可以看到密鑰庫類型是 JKS,在後面的配置里會用到。

D:>keytool -list -keystore tomcat_https.keystore  輸入密鑰庫口令:    密鑰庫類型: JKS  密鑰庫提供方: SUN    您的密鑰庫包含 1 個條目    tomcat_https, 2019-4-21, PrivateKeyEntry,  證書指紋 (SHA1): 1E:5F:15:9C:45:BD:D3:2A:7E:7F:1F:83:56:B8:74:E0:8B:CA:FD:F6    D:>

自己生成的 HTTPS 證書只能用來自己測試,真正用於網路上時,瀏覽器會顯示證書無法資訊。因此如果想要得到一個真實有效的證書,請看文章末尾。

2. 配置 HTTPS 證書

創建一個 Springboot 項目這裡不提,拷貝上一步驟中生成的 tomcat_https.keystore 證書文件到src/main/resource 文件夾下,先看下總體的項目結構。

項目結構如下

然後在 application.yml 文件中配置 HTTPS 相關資訊。直接配置了埠號為 443,443是 HTTPS 的默認埠,這樣在使用 HTTPS 就行訪問的時候就不需要寫額外的埠號了。

# 配置 HTTPS 相關資訊  server:    port: 443    http-port: 80 # 為了後面的配置使用,暫時無用    ssl:      enabled: true      key-store: classpath:tomcat_https.keystore # 證書文件      key-password: 123456  # 密碼      key-store-type: JKS # 密鑰庫類型      key-alias: tomcat_https

這時,已經可以通過 HTTPS 進行頁面訪問了。

3. 測試 HTTPS 證書

直接編寫一個 介面用於測試。

/**   * <p>   * Https 介面控制類   *   * @Author niujinpeng   * @Date 2019/4/20 22:59   */  @RestController  public class HttpsController {        @GetMapping(value = "/hello")      public String hello() {          return "Hello HTTPS";      }    }

啟動之後可以通過 https://localhost/hello 進行訪問了。

HTTPS 訪問測試

當然,由於是自己生成的證書,會提示不安全,繼續訪問即可,如果是正常申請或者購買的證書就不會有這個問題的,文末有免費的 CA 證書申請方式。

4. HTTP 跳轉 HTTPS

在上面的測試里,HTTPS 已經可以訪問了,但是 HTTP 卻不能訪問,大多數情況下在啟用了 HTTPS 之後,都會希望 HTTP 的請求會自動跳轉到 HTTPS,這個在 Springboot 里自然也是可以實現的。我們只需要寫一個配置類把 HTTP 請求直接轉發到 HTTPS 即可。

/**   * <p>   * HTTP 強制跳轉 HTTPS   *   * @Author niujinpeng   * @Date 2019/4/21 17:47   */  @Configuration  public class Http2Https {        @Value("${server.port}")      private int sslPort;      @Value("${server.http-port}")      private int httpPort;        @Bean      public TomcatServletWebServerFactory servletContainerFactory() {          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);              }          };          Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");          connector.setScheme("http");          connector.setPort(httpPort);          connector.setRedirectPort(sslPort);          tomcat.addAdditionalTomcatConnectors(connector);          return tomcat;      }  }

再次啟動之後,使用 http://localhost/hello 訪問會自動跳轉到 https://localhost/hello.

5. 免費證書申請

如果需要申請免費證書,可以在騰訊雲上免費申請,請參考:

如果想要自己安裝證書,請參考:

? 文章相關程式碼已經上傳 Github Spring Boot https, 歡迎⭐Star️,歡迎 Fork !