https 如今已經愈來愈普及了,特別是作一些小程序或者公衆號開發的時候,https 基本上都是剛需了。java
不過一個 https 證書仍是挺費錢的,我的開發者能夠在各個雲服務提供商那裏申請一個免費的證書。我印象中有效期一年,能夠申請 20 個。nginx
今天要和你們聊的是在 Spring Boot 項目中,如何開啓 https 配置,爲咱們的接口保駕護航。算法
咱們先來看看什麼是 https,根據 wikipedia 上的介紹:apache
超文本傳輸安全協議(HyperText Transfer Protocol Secure),縮寫:HTTPS;常稱爲 HTTP over TLS、HTTP over SSL 或 HTTP Secure)是一種經過計算機網絡進行安全通訊的傳輸協議。HTTPS 經由 HTTP 進行通訊,但利用 SSL/TLS 來加密數據包。HTTPS 開發的主要目的,是提供對網站服務器的身份認證,保護交換數據的隱私與完整性。這個協議由網景公司(Netscape)在 1994 年首次提出,隨後擴展到互聯網上。小程序
歷史上,HTTPS 鏈接常常用於網絡上的交易支付和企業信息系統中敏感信息的傳輸。在 2000 年代末至 2010 年代初,HTTPS 開始普遍使用,以確保各種型的網頁真實,保護帳戶和保持用戶通訊,身份和網絡瀏覽的私密性。後端
另外,還有一種安全超文本傳輸協議(S-HTTP),也是 HTTP 安全傳輸的一種實現,可是 HTTPS 的普遍應用而成爲事實上的 HTTP 安全傳輸實現,S-HTTP並無獲得普遍支持。瀏覽器
首先咱們須要有一個 https 證書,咱們能夠從各個雲服務廠商處申請一個免費的,不過本身作實驗沒有必要這麼麻煩,咱們能夠直接藉助 Java 自帶的 JDK 管理工具 keytool 來生成一個免費的 https 證書。tomcat
進入到 %JAVVA_HOME%\bin
目錄下,執行以下命令生成一個數字證書:安全
keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048 -keystore D:\javaboy.p12 -validity 365
複製代碼
命令含義以下:bash
具體生成過程以下圖:
命令執行完成後 ,咱們在 D 盤目錄下會看到一個名爲 javaboy.p12 的文件。以下圖:
有了這個文件以後,咱們的準備工做就算是 OK 了。
接下來咱們須要在項目中引入 https。
將上面生成的 javaboy.p12 拷貝到 Spring Boot 項目的 resources 目錄下。而後在 application.properties 中添加以下配置:
server.ssl.key-store=classpath:javaboy.p12
server.ssl.key-alias=tomcathttps
server.ssl.key-store-password=111111
複製代碼
其中:
配置完成後,就能夠啓動 Spring Boot 項目了,此時若是咱們直接使用 Http 協議來訪問接口,就會看到以下錯誤:
改用 https 來訪問 ,結果以下:
這是由於咱們本身生成的 https 證書不被瀏覽器承認,不過不要緊,咱們直接點擊繼續訪問就能夠了(實際項目中只須要更換一個被瀏覽器承認的 https 證書便可)。
考慮到 Spring Boot 不支持同時啓動 HTTP 和 HTTPS ,爲了解決這個問題,咱們這裏能夠配置一個請求轉發,當用戶發起 HTTP 調用時,自動轉發到 HTTPS 上。
具體配置以下:
@Configuration
public class TomcatConfig {
@Bean
TomcatServletWebServerFactory tomcatServletWebServerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(){
@Override
protected void postProcessContext(Context context) {
SecurityConstraint constraint = new SecurityConstraint();
constraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
constraint.addCollection(collection);
context.addConstraint(constraint);
}
};
factory.addAdditionalTomcatConnectors(createTomcatConnector());
return factory;
}
private Connector createTomcatConnector() {
Connector connector = new
Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(8081);
connector.setSecure(false);
connector.setRedirectPort(8080);
return connector;
}
}
複製代碼
在這裏,咱們配置了 Http 的請求端口爲 8081,全部來自 8081 的請求,將被自動重定向到 8080 這個 https 的端口上。
如此以後,咱們再去訪問 http 請求,就會自動重定向到 https。
Spring Boot 中加入 https 其實很方便。若是你使用了 nginx 或者 tomcat 的話,https 也能夠發很是方便的配置,從各個雲服務廠商處申請到 https 證書以後,官方都會有一個詳細的配置教程,通常照着作,就不會錯了。
關注公衆號【江南一點雨】,專一於 Spring Boot+微服務以及先後端分離等全棧技術,按期視頻教程分享,關注後回覆 Java ,領取鬆哥爲你精心準備的 Java 乾貨!