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

1. 獲取 HTTPS 證書

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

<!-- more -->git

查看 keytool 工具使用說明。github

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 ,咱們生成本身的自簽名證書。web

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 證書只能用來本身測試,真正用於網絡上時,瀏覽器會顯示證書沒法信息。所以若是想要獲得一個真實有效的證書,請看文章末尾。spring

2. 配置 HTTPS 證書

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

項目結構以下

而後在 application.yml 文件中配置 HTTPS 相關信息。直接配置了端口號爲 443,443是 HTTPS 的默認端口,這樣在使用 HTTPS 就行訪問的時候就不須要寫額外的端口號了。apache

# 配置 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 證書

直接編寫一個 接口用於測試。tomcat

/**
 * <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 !

相關文章
相關標籤/搜索