您當前的位置:首頁 > 旅遊

HTTPS原理及互動過程

作者:由 胡俊銘 發表于 旅遊時間:2017-07-30

HTTP及HTTPS

HTTP

是一個客戶端和伺服器端請求和應答的標準(TCP)。客戶端是終端使用者,伺服器端是網站。透過使用Web瀏覽器、網路爬蟲或者其它的工具,客戶端發起一個到伺服器上指定埠(預設埠為80)的HTTP請求。(我們稱這個客戶端)叫使用者代理(user agent)。應答的伺服器上儲存著(一些)資源,比如HTML檔案和影象,本質上是一種不安全的請求互動方式。

HTTPS

(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全為目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。 它是一個URI scheme(抽象識別符號體系),句法類同http:體系。用於安全的HTTP資料傳輸。

https://

URL

表明它使用了HTTP,但HTTPS存在不同於HTTP的預設埠及一個加密/身份驗證層(在HTTP與TCP之間)。這個系統的最初研發由網景公司(Netscape)進行,並內置於其瀏覽器Netscape Navigator中,提供了身份驗證與加密通訊方法。現在它被廣泛用於全球資訊網上安全敏感的通訊,例如交易支付方面。

HTTP和HTTPS區別

https協議需要到ca申請證書,一般免費證書很少,需要交費。

http是超文字傳輸協議,資訊是明文傳輸,https 則是具有安全性的ssl加密傳輸協議 http和https使用的是完全不同的連線方式用的埠也不一樣:前者是80,後者是443。

http的連線很簡單,是無狀態的 HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議 要比http協議安全

HTTPS解決的問題

(1)信任主機的問題。

採用https 的server 必須從CA 申請一個用於證明伺服器用途型別的證書。

該證書只有用於對應的server 的時候,客戶度才信任次主機。所以目前所有的銀行系統網站,關鍵部分應用都是https 的。 客戶透過信任該證書,從而信任了該主機。其實這樣做效率很低,但是銀行更側重安全。 這一點對我們沒有任何意義,我們的server,採用的證書不管自己issue 還是從公眾的地方issue, 客戶端都是自己人,所以我們也就肯定信任該server。

(2)通訊過程中的資料的洩密和被竄改。

1)一般意義上的https, 就是 server 有一個證書。

a) 主要目的是保證server 就是他聲稱的server。這個跟第一點一樣。

b) 服務端和客戶端之間的所有通訊,都是加密的。

i、具體講,是客戶端產生一個對稱的金鑰,透過server 的證書來交換金鑰。 一般意義上的握手過程。

ii、加下來所有的資訊往來就都是加密的。 第三方即使截獲,也沒有任何意義。因為他沒有金鑰。 當然竄改也就沒有什麼意義了。

2)少許對客戶端有要求的情況下,會要求客戶端也必須有一個證書。

a) 這裡客戶端證書,其實就類似表示個人資訊的時候,除了使用者名稱/密碼, 還有一個CA 認證過的身份。 應為個人證書一般來說上別人無法模擬的,所有這樣能夠更深的確認自己的身份。

b) 目前少數個人銀行的專業版是這種做法,具體證書可能是拿隨身碟作為一個備份的載體。像我用的交通銀行的網上銀行就是採取的這種方式。 HTTPS 一定是繁瑣的。

a) 本來簡單的http協議,一個get一個response。由於https 要還金鑰和確認加密演算法的需要。單握手就需要6/7 個往返。

i、任何應用中,過多的round trip 肯定影響效能。

b) 接下來才是具體的http協議,每一次響應或者請求, 都要求客戶端和服務端對會話的內容做加密/解密。

i、儘管對稱加密/解密效率比較高,可是仍然要消耗過多的CPU,為此有專門的SSL 晶片。 如果CPU 信能比較低的話,肯定會降低效能,從而不能serve 更多的請求。

附SSL的簡介

SSL是Netscape公司所提出的安全保密協議,在瀏覽器(如Internet Explorer、Netscape Navigator)和Web伺服器(如Netscape的Netscape Enterprise Server、ColdFusion Server等等)之間構造安全通道來進行資料傳輸,SSL執行在TCP/IP層之上、應用層之下,為應用程式提供加密資料通道,它採用了RC4、MD5 以及RSA等加密演算法,使用40 位的金鑰,適用於商業資訊的加密。

同時,Netscape公司相應開發了HTTPS協議並內置於其瀏覽器中,HTTPS實際上就是SSL over HTTP,它使用預設埠443,而不是像HTTP那樣使用埠80來和TCP/IP進行通訊。HTTPS協議使用SSL在傳送方把原始資料進行加密,然 後在接受方進行解密,加密和解密需要傳送方和接受方透過交換共知的金鑰來實現,因此,所傳送的資料不容易被網路駭客截獲和解密。

然而,加密和解密過程需要耗費系統大量的開銷,嚴重降低機器的效能,相關測試資料表明使用HTTPS協議傳輸資料的工作效率只有使用HTTP協議傳輸的十分之一。

假如為了安全保密,將一個網站所有的Web應用都啟用SSL技術來加密,並使用HTTPS協議進行傳輸,那麼該網站的效能和效率將會大大降低,而且 沒有這個必要,因為一般來說並不是所有資料都要求那麼高的安全保密級別,所以,我們只需對那些涉及機密資料的互動處理使用HTTPS協議,這樣就做到魚與 熊掌兼得。總之不需要用https 的地方,就儘量不要用。

3 HTTPS工作原理

HTTPS其實是有兩部分組成:HTTP + SSL / TLS,也就是在HTTP上又加了一層處理加密資訊的模組。服務端和客戶端的資訊傳輸都會透過TLS進行加密,所以傳輸的資料都是加密後的資料。具體是如何進行加密,解密,驗證的,且看下圖。

HTTPS原理及互動過程

HTTPS原理及互動過程

HTTPS在傳輸資料之前需要客戶端(瀏覽器)與服務端(網站)之間進行一次握手,在握手過程中將確立雙方加密傳輸資料的密碼資訊。TLS/SSL 協議不僅僅是一套加密傳輸的協議,更是一件經過藝術家精心設計的藝術品,TLS/SSL中使用了非對稱加密,對稱加密以及HASH演算法。握手過程的具體描 述如下:

HTTPS原理及互動過程

HTTPS原理及互動過程

HTTPS原理及互動過程

HTTPS原理及互動過程

這裡瀏覽器與網站互相傳送加密的握手訊息並驗證,目的是為了保證雙方都獲得了一致的密碼,並且可以正常的加密解密資料,為後續真正資料的傳輸做一次測試。另外,HTTPS一般使用的加密與HASH演算法如下:

HTTPS原理及互動過程

HTTPS原理及互動過程

HTTPS對應的通訊時序圖如下:

HTTPS原理及互動過程

HTTPS原理及互動過程

附:HTTPS請求示例程式碼

import java。io。*;

import java。net。*;

import java。security。cert。CertificateException;

import java。security。cert。X509Certificate;

import javax。net。ssl。*;

public class TrustSSL {

private static class TrustAnyTrustManager implements X509TrustManager {

public void checkClientTrusted(X509Certificate[] chain, String authType)

throws CertificateException {

}

public void checkServerTrusted(X509Certificate[] chain, String authType)

throws CertificateException {

}

public X509Certificate[] getAcceptedIssuers() {

return new X509Certificate[] {};

}

}

private static class TrustAnyHostnameVerifier implements HostnameVerifier {

public boolean verify(String hostname, SSLSession session) {

return true;

}

}

public static void main(String[] args) throws Exception {

InputStream in = null;

OutputStream out = null;

byte[] buffer = new byte[4096];

String str_return = “”;

try {

SSLContext sc = SSLContext。getInstance(“SSL”);

sc。init(null, new TrustManager[] { new TrustAnyTrustManager() },

new java。security。SecureRandom());

URL console = new URL(“

https://

192。168。1。188/testServl

et?username=admin

”);

HttpsURLConnection conn = (HttpsURLConnection) console。openConnection();

conn。setSSLSocketFactory(sc。getSocketFactory());

conn。setHostnameVerifier(new TrustAnyHostnameVerifier());

conn。connect();

InputStream is = conn。getInputStream();

DataInputStream indata = new DataInputStream(is);

String ret = “”;

while (ret != null) {

ret = indata。readLine();

if (ret != null && !ret。trim()。equals(“”)) {

str_return = str_return+ new String(ret。getBytes(“ISO-8859-1”), “UTF-8”);

}

}

conn。disconnect();

} catch (ConnectException e) {

System。out。println(“ConnectException”);

System。out。println(e);

throw e;

} catch (IOException e) {

System。out。println(“IOException”);

System。out。println(e);

throw e;

} finally {

try {

in。close();

} catch (Exception e) {

}

try {

out。close();

} catch (Exception e) {

}

}

System。out。println(str_return);

}

}

標簽: https  加密  http  SSL  客戶端