https理論及實踐
什麼是https協議?
http協議以明文的方式在網路中傳輸,安全性難以保證,https在http協議的基礎上加入SSL/TLS層。TLS是SSL協議的最新版本,SSL使用SSL數字證書在通訊兩端建立加密鏈路,對兩端通訊資料進行加密,從而保證通訊資料安全。
http和https協議比較如下:
SSL協議工作原理
SSL協議主要涉及非對稱加密和對稱加密技術。
非對稱加密,使用一對金鑰加解密資料,公鑰(public key)對外公開,私鑰自己保留(private key)。使用私鑰加密的資料只有對應的公鑰才能解密。SSL使用非對稱加密進行通訊初始化(SSL handshake),非對稱加密演算法包括RSA,、DSA、PKCS等。
對稱加密,加解密都用同一個key。SSL在通訊初始化(handshake)後,用session key進行對稱加密通訊。對稱加密演算法包括AES-128, AES-192 and AES-256。
SSL協議通訊包括兩個階段:SSL handshake和資料傳輸。SSL handshake階段使用非對稱加密,資料傳輸階段使用對稱加密。
SSL handshake包含以下步驟:
1. 客戶端傳送"client hello"訊息,這條訊息中包含客戶端SSL版本以及其它服務端需要的資訊。
2. 服務端回覆"server hello"訊息,這條訊息包含服務端SSL版本,包含public key的SSL數字證書及其它資訊。
3. 客戶端傳送請求給CA(Certificate Authority,證書頒發機構)對服務端進行身份驗證。驗證失敗則拒絕建立SSL連線,否則繼續4.
4. 客戶端生成session key,用服務端的public key加密,併發送給服務端。假如服務端也要求驗證客戶端,客戶端也需要傳送自己的證書(一般是server之間的通訊需要)。
5. 服務端用自己的private key解密出session key,並用session key加密傳送確認訊息。
資料傳輸階段如下,用SSL handshake階段生成的session key對資料進行對稱加密通訊。和非對稱加密相比,對稱加密簡單、加解密速度會更快。
SSL證書
SSL證書是由CA機構頒發的含服務端public key及其它資訊的資料檔案。比如google的數字證書如下,可以點選詳細資訊檢視更多證書內容。
數字證書由X.509標準定義,X.509使用Abstract Syntax Notation One (ASN.1)標記去表示數字證書結構。數字證書一般包含下面這些域。
SSL證書基於驗證級別和認證domain數可分為不同型別,基於驗證級別可分為Domain Validated Certificates(DV,域名型)、Organization Validated Certificates(OV,企業型)、Extended Validated Certificates(EV,企業增強型)。域名型證書用於驗證單個域名,企業型證書可驗證某域名下的所有子域名,比如*.killianxu.cn,企業增強型證書可用於驗證不相關的多個相關域名。基於domain數可分為Single Domain Certificate、Wildcard SSL Certificate和Unified SSL Certificate /Multi-Domain SSL Certificate/SAN Certificate。
獲取SSL證書
SSL證書可以從CA機構購買或者從免費CA機構獲取。在申請證書時可能需要提交Certificate Signing Request (CSR)。CSR是由openssl等SSL tools工具或伺服器生成的Base64編碼文字。內含公鑰、域名、組織、地址等資訊,CA機構頒發的證書中就包含CSR中的公鑰資訊。CSR文字由-----BEGIN NEW CERTIFICATE REQUEST-----"開始,並由"-----END NEW CERTIFICATE REQUEST-----結束,CSR格式如下:
可線上生成CSR和private key兩個檔案。
生成csr檔案後,可申請免費DV型別SSL證書。
騰訊雲可免費申請域名驗證級別的SSL證書,生成證書過程自動生成CSR。
生成的證書可下載安裝到server。SSL證書有不同的格式,PEM和PKCS#7使用Base64編碼,DER和 PKCS#12使用二進位制編碼。
騰訊雲申請的證書如下,其中包含了適用於幾種主流伺服器的證書格式,其中www.killianxu.cn.csr為自動生成的CSR檔案。
安裝SSL證書
每種伺服器證書安裝方法都不一樣,本文講解在tomcat上的安裝。在安裝前若證書格式和伺服器支援的證書格式不一樣,需要利用OpenSSL轉換。
在tomcat安裝路徑下conf/server.xml增加如下SSL/TLS配置,支援https:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true" scheme="https"> <SSLHostConfig> <Certificate certificateKeystoreFile="conf/www.killianxu.cn.jks" certificateKeystorePassword="d62spdpc5se3an" certificateKeyAlias="www.killianxu.cn" type="RSA" /> </SSLHostConfig> </Connector>
強制所有的http訪問重定向到https,在conf/web.xml的結束標籤web-app強增加配置:
<login-config> <!-- Authorization setting for SSL --> <auth-method>CLIENT-CERT</auth-method> <realm-name>Client Cert Users-only Area</realm-name> </login-config> <security-constraint> <!-- Authorization setting for SSL --> <web-resource-collection > <web-resource-name >SSL</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint>
重啟tomcat
驗證證書安裝成功
輸入:curl -v https://www.killianxu.cn:8443/test.html
可看到1部分獲取到SSL證書資訊,2部分獲取網頁資料
輸入:curl -v http://www.killianxu.cn:9999/test.html
http協議收到302重定向狀態碼,並有Location重定向新路徑
參考文獻
https://www.tutorialsteacher.com/https
https://yevon-cn.github.io/2017/04/09/https-config-of-tomcat.