HTTP那些小事

這是一篇信息整理文章,能夠看成工具來看html

HTTP全稱是超文本傳輸協議,構建於TCP之上,屬於應用層協議。算法

http通訊有什麼問題?

1.1 可能被竊聽

  • HTTP 自己不具有加密的功能,HTTP 報文使用明文方式發送
  • 因爲互聯網是由聯通世界各個地方的網絡設施組成,全部發送和接收通過某些設備的數據均可能被截獲或窺視。(例如你們都熟悉的抓包工具:Wireshark),即便通過加密處理,也會被窺視是通訊內容,只是可能很難或者沒法破解出報文的信息而已

1.2 認證問題

  • 沒法確認你發送到的服務器就是真正的目標服務器(可能服務器是假裝的)
  • 沒法肯定返回的客戶端是不是按照真實意圖接收的客戶端(多是假裝的客戶端)
  • 沒法肯定正在通訊的對方是否具有訪問權限,Web 服務器上某些重要的信息,只想發給特定用戶即便是無心義的請求也會照單全收。沒法阻止海量請求下的 DoS 攻擊(Denial of Service,拒絕服務攻擊)。

1.3 可能被篡改

請求或響應在傳輸途中,遭攻擊者攔截並篡改內容的攻擊被稱爲中間人攻擊(Man-in-the-Middle attack,MITM)瀏覽器

HTTPS如何解決上述三個問題

HTTPS是在通訊接口部分用 TLS(Transport Layer Security)協議。緩存

SSL 和 TLS 的區別

  • 傳輸層安全性協議(英語:Transport Layer Security,縮寫做 TLS),及其前身安全套接層(Secure Sockets Layer,縮寫做 SSL)是一種安全協議,目的是爲互聯網通訊,提供安全及數據完整性保障。
  • 網景公司(Netscape)在1994年推出首版網頁瀏覽器,網景導航者時,推出HTTPS協議,以SSL進行加密,這是SSL的起源。
  • IETF將SSL進行標準化,1999年公佈初版TLS標準文件。隨後又公佈RFC 5246 (2008年8月)與 RFC 6176 (2011年3月)。如下就簡稱SSL
  • TLS是SSL的標準. HTTPS 就是 HTTP + SSL

SSL 協議

HTTPS 協議的主要功能基本都依賴於 TLS/SSL 協議,TLS/SSL 的功能實現主要依賴於三類基本算法:散列函數 、對稱加密和非對稱加密,其利用非對稱加密實現身份認證和密鑰協商,對稱加密算法採用協商的密鑰對數據加密,基於散列函數驗證信息的完整性。安全

1.1 對稱加密

  • 常見的有 AES-CBC、DES、3DES、AES-GCM等,相同的密鑰能夠用於信息的加密和解密,掌握密鑰才能獲取信息,可以防止信息竊聽,通訊方式是1對1;
  • 對稱加密須要共享相同的密碼,密碼的安全是保證信息安全的基礎,服務器和多 個客戶端通訊,須要維持多個密碼記錄,且缺乏修改密碼的機制;
  • 優勢:算法公開、計算量小、加密速度快、加密效率高。
  • 缺點:交易雙方都使用一樣鑰匙,安全性得不到保證。

1.2 非對稱加密技術

  • 即常見的 RSA 算法,還包括 ECC、DH 等算法,算法特色是,密鑰成對出現,通常稱爲公鑰(公開)和私鑰(保密),公鑰加密的信息只能私鑰解開,私鑰加密的信息只能公鑰解開。所以掌握公鑰的不一樣客戶端之間不能互相解密信息,只能和掌握私鑰的服務器進行加密通訊,服務器能夠實現1對多的通訊,客戶端也能夠用來驗證掌握私鑰的服務器身份。
  • 非對稱加密的特色是信息傳輸一對多,服務器只須要維持一個私鑰就可以和多個客戶端進行加密通訊,但服務器發出的信息可以被全部的客戶端解密,且該算法的計算複雜,加密速度慢。

1.3 完整性驗證算法

  • 常見的有 MD五、SHA一、SHA256,該類函數特色是函數單向不可逆、對輸入很是敏感、輸出長度固定,針對數據的任何修改都會改變散列函數的結果,用於防止信息篡改並驗證數據的完整性;
  • 在信息傳輸過程當中,散列函數不能單獨實現信息防篡改,由於明文傳輸,中間人能夠修改信息以後從新計算信息摘要,所以須要對傳輸的信息以及信息摘要進行加密;

1.4 工做方式

結合三類算法的特色,TLS 的基本工做方式是bash

  • 客戶端使用非對稱加密與服務器進行通訊,實現身份驗證並協商對稱加密使用的密鑰
  • 而後對稱加密算法採用協商密鑰對信息以及信息摘要進行加密通訊,不一樣的節點之間採用的對稱密鑰不一樣,從而能夠保證信息只能通訊雙方獲取。

1.5 SSL協議構成

  • 第一層是記錄協議(Record Protocol), 用於定義傳輸格式。
  • 第二層握手協議(Handshake Protocol),它創建在SSL記錄協議之上,用於在實際的數據傳輸開始前,通信雙方進行身份認證、協商加密算法、交換加密密鑰等。

https服務器

在創業HTTPS服務器以前,服務器首先須要建立公鑰、私鑰及證書,步驟以下服務器

2.1 建立私鑰

openssl genrsa -out privatekey.pem 1024
複製代碼

2.2 建立證書籤名請求(Certificate Signing Request)文件

openssl req -new -key privatekey.pem -out certrequest.csr
複製代碼

2.3 獲取證書

證書應該是一個通過證書授證中心簽名的文件,該證書文件內包含了服務器端提供的公鑰以及證書的辦法機構等信息。網絡

openssl x509 -req -in certrequest.csr -signkey privatekey.pem -out certificate.pem
複製代碼

2.4 獲取證書

在具有了證書文件後,可使用該證書文件建立一個pfx文件。 所謂pfx文件,是指該文件內容必須符合公鑰加密技術12號標準。函數

openssl pkcs12 -export -in certificate.pem -inkey privatekey.pem -out certificate.pfx
複製代碼

2.5 建立服務器

https.createServer(options,[requestListener]);
複製代碼
  • pfx 私鑰、公鑰以及證書
  • key 私鑰
  • passphrase 爲私鑰指定密碼
  • cert 公鑰
  • ca 證書,用於指定一組證書,默認屬性值爲幾個著名的證書受權中心,例如VerlSign
  • crl 指定證書吊銷主
let https = require('https');
let fs = require('fs');
let path = require('path');
let key = fs.readFileSync(path.join(__dirname, 'privatekey.pem'));
let cert = fs.readFileSync(path.join(__dirname, 'certificate.pem'));
let opts = {
    key,
    cert
};
let server = https.createServer(opts, function (req, res) {
    console.log(req.url);
    if (req.url != '/favicon.ico') {
        res.setHeader('Content-Type', 'text/html');
        res.write(`<html><head><meta charset="utf8"/></head><body>hello</body></html>`);
        res.end();
    }
});
server.listen(443, function () {
    console.log('服務器端開始監聽!');
    //server.close();
});
server.on('close', function () {
    console.log('服務器已被關閉!');
});
複製代碼

2.6 建立HTTPS客戶端

在https模塊中,可使用request方法向其它使用HTTPS協議的網站請求數據工具

let req = https.request(options,callback);
複製代碼
  • host 指定域名或目標主機的IP地址
  • hostname 指定域名或目標主機的IP地址
  • port 端口號
  • method 指定請求方法名
  • path 指下請求路徑及查詢字符串
  • headers 客戶端請求頭對象
  • auth 指定認證信息部分
  • agent 指定用戶代理,指定false則從鏈接池中挑選一個鏈接狀態爲關閉的https.Agent對象
  • pfx 指定私鑰、公鑰和證書
  • key 指定私鑰
  • cert 公鑰
  • ca 一組證書
let https = require('https');
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"
let options = {
    hostname: '123.57.77.210',
    port: 443,
    path: '/',
    method: 'GET',
    agent: false
}
let req = https.request(options, function (res) {
    console.log(res.statusCode);
    console.log(res.headers);
    res.setEncoding('utf8');
    res.on('data', function (chunk) {
        console.log(chunk);
    });
});
req.end();
複製代碼

HTTP

  • 請求的一方叫客戶端,響應的一方叫服務器端
  • 經過請求和響應達成通訊
  • HTTP是一種不保存狀態的協議

3.1 內容協商

首部字段

  • Accept
  • Accept-Charset
  • Accept-Encoding
  • Accept-Language
  • Content-Language

協商類型

  • 服務器驅動
  • 客戶端驅動協商
  • 透明協商

3.2 狀態碼

狀態碼負責表示客戶端請求的返回結果、標記服務器端是否正常、通知出現的錯誤

3.3 狀態碼類別

類別 緣由短語

  • 1XX Informational(信息性狀態碼)
  • 2XX Success(成功狀態碼)
  • 3XX Redirection(重定向)
  • 4XX Client Error(客戶端錯誤狀態碼)
  • 5XX Server Error(服務器錯誤狀態嗎)

3.4.1 2XX 成功

  • 200(OK 客戶端發過來的數據被正常處理
  • 204(Not Content 正常響應,沒有實體
  • 206(Partial Content 範圍請求,返回部分數據,響應報文中由Content-Range指定實體內容

3.4.2 3XX 重定向

  • 301(Moved Permanently) 永久重定向
  • 302(Found) 臨時重定向,規範要求方法名不變,可是都會改變
  • 303(See Other) 和302相似,但必須用GET方法
  • 304(Not Modified) 狀態未改變 配合(If-Match、If-Modified-Since、If-None_Match、If-Range、If-Unmodified-Since)
  • 307(Temporary Redirect) 臨時重定向,不應改變請求方法

3.4.3 4XX 客戶端錯誤

  • 400(Bad Request) 請求報文語法錯誤
  • 401 (unauthorized) 須要認證
  • 403(Forbidden) 服務器拒絕訪問對應的資源
  • 404(Not Found) 服務器上沒法找到資源

3.4.4 5XX 服務器端錯誤

  • 500(Internal Server Error)服務器故障
  • 503(Service Unavailable) 服務器處於超負載或正在停機維護

首部

4.1 通用首部字段

首部字段名 說明
Cache-Control 控制緩存行爲
Connection 連接的管理
Date 報文日期
Pragma 報文指令
Trailer 報文尾部的首部
Trasfer-Encoding 指定報文主體的傳輸編碼方式
Upgrade 升級爲其餘協議
Via 代理服務器信息
Warning 錯誤通知

4.2 請求首部字段

首部字段名 說明
Accept 用戶代理可處理的媒體類型
Accept-Charset 優先的字符集
Accept-Encoding 優先的編碼
Accept-Langulage 優先的語言
Authorization Web認證信息
Expect 期待服務器的特定行爲
From 用戶的電子郵箱地址
Host 請求資源所在的服務器
If-Match 比較實體標記
If-Modified-Since 比較資源的更新時間
If-None-Match 比較實體標記
If-Range 資源未更新時發送實體Byte的範圍請求
If-Unmodified-Since 比較資源的更新時間(和If-Modified-Since相反)
Max-Forwards 最大傳輸跳數
Proxy-Authorization 代理服務器須要客戶端認證
Range 實體字節範圍請求
Referer 請求中的URI的原始獲取方
TE 傳輸編碼的優先級
User-Agent HTTP客戶端程序的信息

4.3 響應首部字段

首部字段名 說明
Accept-Ranges 是否接受字節範圍
Age 資源的建立時間
ETag 資源的匹配信息
Location 客戶端重定向至指定的URI
Proxy-Authenticate 代理服務器對客戶端的認證信息
Retry-After 再次發送請求的時機
Server 服務器的信息
Vary 代理服務器緩存的管理信息
www-Authenticate 服務器對客戶端的認證

4.4 實體首部字段

首部字段名 說明
Allow 資源可支持的HTTP方法
Content-Encoding 實體的編碼方式
Content-Language 實體的天然語言
Content-Length 實體的內容大小(字節爲單位)
Content-Location 替代對應資源的URI
Content-MD5 實體的報文摘要
Content-Range 實體的位置範圍
Content-Type 實體主體的媒體類型
Expires 實體過時時間
Last-Modified 資源的最後修改時間

這些信息頭是作壓縮,緩存,範圍請求等功能的必需條件,想了解的能夠看看我寫的靜態服務

相關文章
相關標籤/搜索