Springboot 系列(十四)迅速啟用 HTTPS 加密你的網站
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 進行訪問了。
當然,由於是自己生成的證書,會提示不安全,繼續訪問即可,如果是正常申請或者購買的證書就不會有這個問題的,文末有免費的 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. 免費證書申請
如果需要申請免費證書,可以在騰訊雲上免費申請,請參考:
- 免費版 DV SSL 證書申請。
如果想要自己安裝證書,請參考:
- Apache 伺服器證書安裝
- Nginx 伺服器證書安裝
- Tomcat 伺服器證書安裝
- Windows IIS 伺服器證書安裝