一、什麼是SSL? SSL(Secure Sockets Layer 安全套接層),及其繼任者傳輸層安全(Transport Layer Security,TLS)是為網路通信提供安全及數據完整性的一種安全協議。TLS與SSL在傳輸層對網路連接進行加密。 SSL協議位於TCP/IP協議與各種應用層協 ...
一、什麼是SSL?
SSL(Secure Sockets Layer 安全套接層),及其繼任者傳輸層安全(Transport Layer Security,TLS)是為網路通信提供安全及數據完整性的一種安全協議。TLS與SSL在傳輸層對網路連接進行加密。
SSL協議位於TCP/IP協議與各種應用層協議之間,為數據通訊提供安全支持。SSL協議可分為兩層:SSL記錄協議(SSL Record Protocol):它建立在可靠的傳輸協議(如TCP)之上,為高層協議提供數據封裝、壓縮、加密等基本功能的支持。 SSL握手協議(SSL Handshake Protocol):它建立在SSL記錄協議之上,用於在實際的數據傳輸開始前,通訊雙方進行身份認證、協商加密演算法、交換加密密鑰等。
1.1 提供服務
2)加密數據以防止數據中途被竊取;
3)維護數據的完整性,確保數據在傳輸過程中不被改變。
二、什麼是HTTPS?
HTTPS(Hypertext Transfer Protocol Secure)安全超文本傳輸協議
它是由Netscape開發並內置於其瀏覽器中,用於對數據進行壓縮和解壓操作,並返回網路上傳送回的結果。HTTPS實際上應用了Netscape的完全套接字層(SSL)作為HTTP應用層的子層。(HTTPS使用埠443,而不是象HTTP那樣使用埠80來和TCP/IP進行通信。)SSL使用40 位關鍵字作為RC4流加密演算法,這對於商業信息的加密是合適的。HTTPS和SSL支持使用X.509數字認證,如果需要的話用戶可以確認發送者是誰。。
以上資料參考《百度百科》
三、HTTPS與SSL的關係?
HTTPS與SSL的關係是包含與被包含的關係,簡單來說,HTTPS=HTTP+SSL。也就是說HTTPS是在HTTP上面加了一層SSL協議,在HTTP站點上部署SSL數字證書就變成了HTTPS。
根據HTTPS與SSL的含義可以看出:SSL在HTTPS協議棧中負責實現上面提到的加密層。
四、Spring Boot中使用HTTPS步驟
(1)要有一個SSL證書,證書怎麼獲取呢?買(通過證書授權機構購買)或者自己生成(通過keytool生成)。
(2)在spring boot中啟用HTTPS
(3)將HTTP重定向到HTTPS(可選)
五、獲取SSL證書
有兩種方式可以獲取到SSL證書:
(1)自己通過keytool生成;
(2)通過證書授權機構購買;
這裡作為演示,採用keytool生成,實際項目中大部分採用的都是購買的方式。
那麼怎麼使用keytool生成呢?
Keytool是java提供的證書生成工具,如果配置了java_home的,直接就可以在控制台進行生成了,這裡演示使用的是window的dos視窗:
(1)打開dos視窗;
(2)輸入如下命令:
Command代碼keytool -genkey -alias tomcat -dname "CN=Andy,OU=kfit,O=kfit,L=HaiDian,ST=BeiJing,C=CN" -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 365
Java代碼
<span style=" font-family: Helvetica, Tahoma, Arial, sans-serif;"> </span>
這裡解釋下命令的各個參數的含義:
-genkey:生成key;
-alias:key的別名;
-dname:指定證書擁有者信息
-storetype:密鑰庫的類型為JCEKS。常用的有JKS(預設),JCEKS(推薦),PKCS12,BKS,UBER。每個密鑰庫只可以是其中一種類型。
-keyalg:DSA或RSA演算法(當使用-genkeypair參數),DES或DESede或AES演算法(當使用-genseckey參數);
-keysize:密鑰的長度為512至1024之
間(64的倍數)
-keystore :證書庫的名稱
-validity : 指定創建的證書有效期多少天
dname的值詳解:
CN(Common Name名字與姓氏)
OU(Organization Unit組織單位名稱)
O(Organization組織名稱)
L(Locality城市或區功能變數名稱稱)
ST(State州或省份名稱)
C(Country國家名稱)
這時候在目錄:C:\Users\Administrator下就會看到一個文件keystore.p12。到這裡SSL證書就有了。
六、Spring Boot中啟用HTTPS
預設情況下Spring Boot內嵌的Tomcat伺服器會在8080埠啟動HTTP服務,Spring Boot允許在application.properties中配置HTTP或HTTPS,但是不可同時配置,如果兩個都啟動,至少有一個要以編程的方式配置,Spring Boot官方文檔建議在application.properties中配置HTTPS,因為HTTPS比HTTP更複雜一些
在application.properties中配置HTTPS,配置信息如下:
Properties代碼
#https埠號. server.port: 443 #證書的路徑. server.ssl.key-store: classpath:keystore.p12 #證書密碼,請修改為您自己證書的密碼. server.ssl.key-store-password: 123456 #秘鑰庫類型 server.ssl.keyStoreType: PKCS12 #證書別名 server.ssl.keyAlias: tomcat
註意:請將在上一步生成的證書放到src/main/resources目錄下。
到這裡,啟動運行程式,隨便訪問一個地址,比如:https://127.0.0.1/hello 就可以訪問了,倒是訪問http://127.0.0.1/hello 是不能夠訪問的,如果要支持http也訪問的話,那麼還需要如下的步驟進行配置,否則對於https的內容到此就配置完成了。
六、將HTTP請求重定向到HTTPS(可選)
上面說了不能同時在application.properties中同時配置兩個connector,所以要以編程的方式配置HTTP connector,然後重定向到HTTPS connector,完整代碼如下:
Java代碼
package com.kfit.config; import org.apache.catalina.Context; import org.apache.catalina.connector.Connector; import org.apache.tomcat.util.descriptor.web.SecurityCollection; import org.apache.tomcat.util.descriptor.web.SecurityConstraint; import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory; import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class TomcatHttpConfig { /** * 配置內置的servlet容器工廠為tomcat. * @return */ @Bean public EmbeddedServletContainerFactory servletContainer() { TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() { @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); } }; //添加連接配置,主要是http的配置信息. tomcat.addAdditionalTomcatConnectors(initiateHttpConnector()); return tomcat; } /** * 配置一個http連接信息. * @return */ private Connector initiateHttpConnector() { Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); connector.setScheme("http"); connector.setPort(8080); connector.setSecure(false); connector.setRedirectPort(443); return connector; } }
這時候重新啟動運用程式,訪問地址:http://127.0.0.1:8080/hello 就會被重定向到地址:https://127.0.0.1/hello,在瀏覽器的地址欄最終看到的也是帶有https的地址。
七、總結
在spring boot中要使用https的話,那麼重要的就是幾個步驟:
(1)備書:準備SSL證書,買或者生--(購買/自己生成)。
(2)配置:在application.properties配置HTTPS信息。
(3)重定向:將HTTP請求重定向到HTTPS(可選)。