HTTP那些小事
這是一篇信息整理文章,可以當(dāng)作工具來(lái)看
HTTP全稱是超文本傳輸協(xié)議,構(gòu)建于TCP之上,屬于應(yīng)用層協(xié)議。
http通信有什么問(wèn)題?
1.1 可能被竊聽(tīng)
- HTTP 本身不具備加密的功能,HTTP 報(bào)文使用明文方式發(fā)送
- 由于互聯(lián)網(wǎng)是由聯(lián)通世界各個(gè)地方的網(wǎng)絡(luò)設(shè)施組成,所有發(fā)送和接收經(jīng)過(guò)某些設(shè)備的數(shù)據(jù)都可能被截獲或窺視。(例如大家都熟悉的抓包工具:Wireshark),即使經(jīng)過(guò)加密處理,也會(huì)被窺視是通信內(nèi)容,只是可能很難或者無(wú)法破解出報(bào)文的信息而已
1.2 認(rèn)證問(wèn)題
- 無(wú)法確認(rèn)你發(fā)送到的服務(wù)器就是真正的目標(biāo)服務(wù)器(可能服務(wù)器是偽裝的)
- 無(wú)法確定返回的客戶端是否是按照真實(shí)意圖接收的客戶端(可能是偽裝的客戶端)
- 無(wú)法確定正在通信的對(duì)方是否具備訪問(wèn)權(quán)限,Web 服務(wù)器上某些重要的信息,只想發(fā)給特定用戶即使是無(wú)意義的請(qǐng)求也會(huì)照單全收。無(wú)法阻止海量請(qǐng)求下的 DoS 攻擊(Denial of Service,拒絕服務(wù)攻擊)。
1.3 可能被篡改
請(qǐng)求或響應(yīng)在傳輸途中,遭攻擊者攔截并篡改內(nèi)容的攻擊被稱為中間人攻擊(Man-in-the-Middle attack,MITM)
HTTPS如何解決上述三個(gè)問(wèn)題
HTTPS是在通信接口部分用 TLS(Transport Layer Security)協(xié)議。
SSL 和 TLS 的區(qū)別
- 傳輸層安全性協(xié)議(英語(yǔ):Transport Layer Security,縮寫(xiě)作 TLS),及其前身安全套接層(Secure Sockets Layer,縮寫(xiě)作 SSL)是一種安全協(xié)議,目的是為互聯(lián)網(wǎng)通信,提供安全及數(shù)據(jù)完整性保障。
- 網(wǎng)景公司(Netscape)在1994年推出首版網(wǎng)頁(yè)瀏覽器,網(wǎng)景導(dǎo)航者時(shí),推出HTTPS協(xié)議,以SSL進(jìn)行加密,這是SSL的起源。
- IETF將SSL進(jìn)行標(biāo)準(zhǔn)化,1999年公布第一版TLS標(biāo)準(zhǔn)文件。隨后又公布RFC 5246 (2008年8月)與 RFC 6176 (2011年3月)。以下就簡(jiǎn)稱SSL
- TLS是SSL的標(biāo)準(zhǔn). HTTPS 就是 HTTP + SSL
SSL 協(xié)議
HTTPS 協(xié)議的主要功能基本都依賴于 TLS/SSL 協(xié)議,TLS/SSL 的功能實(shí)現(xiàn)主要依賴于三類基本算法:散列函數(shù) 、對(duì)稱加密和非對(duì)稱加密,其利用非對(duì)稱加密實(shí)現(xiàn)身份認(rèn)證和密鑰協(xié)商,對(duì)稱加密算法采用協(xié)商的密鑰對(duì)數(shù)據(jù)加密,基于散列函數(shù)驗(yàn)證信息的完整性。
1.1 對(duì)稱加密
- 常見(jiàn)的有 AES-CBC、DES、3DES、AES-GCM等,相同的密鑰可以用于信息的加密和解密,掌握密鑰才能獲取信息,能夠防止信息竊聽(tīng),通信方式是1對(duì)1;
- 對(duì)稱加密需要共享相同的密碼,密碼的安全是保證信息安全的基礎(chǔ),服務(wù)器和多 個(gè)客戶端通信,需要維持多個(gè)密碼記錄,且缺少修改密碼的機(jī)制;
- 優(yōu)點(diǎn):算法公開(kāi)、計(jì)算量小、加密速度快、加密效率高。
- 缺點(diǎn):交易雙方都使用同樣鑰匙,安全性得不到保證。
1.2 非對(duì)稱加密技術(shù)
- 即常見(jiàn)的 RSA 算法,還包括 ECC、DH 等算法,算法特點(diǎn)是,密鑰成對(duì)出現(xiàn),一般稱為公鑰(公開(kāi))和私鑰(保密),公鑰加密的信息只能私鑰解開(kāi),私鑰加密的信息只能公鑰解開(kāi)。因此掌握公鑰的不同客戶端之間不能互相解密信息,只能和掌握私鑰的服務(wù)器進(jìn)行加密通信,服務(wù)器可以實(shí)現(xiàn)1對(duì)多的通信,客戶端也可以用來(lái)驗(yàn)證掌握私鑰的服務(wù)器身份。
- 非對(duì)稱加密的特點(diǎn)是信息傳輸一對(duì)多,服務(wù)器只需要維持一個(gè)私鑰就能夠和多個(gè)客戶端進(jìn)行加密通信,但服務(wù)器發(fā)出的信息能夠被所有的客戶端解密,且該算法的計(jì)算復(fù)雜,加密速度慢。
1.3 完整性驗(yàn)證算法
- 常見(jiàn)的有 MD5、SHA1、SHA256,該類函數(shù)特點(diǎn)是函數(shù)單向不可逆、對(duì)輸入非常敏感、輸出長(zhǎng)度固定,針對(duì)數(shù)據(jù)的任何修改都會(huì)改變散列函數(shù)的結(jié)果,用于防止信息篡改并驗(yàn)證數(shù)據(jù)的完整性;
- 在信息傳輸過(guò)程中,散列函數(shù)不能單獨(dú)實(shí)現(xiàn)信息防篡改,因?yàn)槊魑膫鬏?#xff0c;中間人可以修改信息之后重新計(jì)算信息摘要,因此需要對(duì)傳輸?shù)男畔⒁约靶畔⒄M(jìn)行加密;
1.4 工作方式
結(jié)合三類算法的特點(diǎn),TLS 的基本工作方式是
- 客戶端使用非對(duì)稱加密與服務(wù)器進(jìn)行通信,實(shí)現(xiàn)身份驗(yàn)證并協(xié)商對(duì)稱加密使用的密鑰
- 然后對(duì)稱加密算法采用協(xié)商密鑰對(duì)信息以及信息摘要進(jìn)行加密通信,不同的節(jié)點(diǎn)之間采用的對(duì)稱密鑰不同,從而可以保證信息只能通信雙方獲取。
1.5 SSL協(xié)議構(gòu)成
- 第一層是記錄協(xié)議(Record Protocol), 用于定義傳輸格式。
- 第二層握手協(xié)議(Handshake Protocol),它建立在SSL記錄協(xié)議之上,用于在實(shí)際的數(shù)據(jù)傳輸開(kāi)始前,通訊雙方進(jìn)行身份認(rèn)證、協(xié)商加密算法、交換加密密鑰等。
https服務(wù)器
在創(chuàng)業(yè)HTTPS服務(wù)器之前,服務(wù)器首先需要?jiǎng)?chuàng)建公鑰、私鑰及證書(shū),步驟如下
2.1 創(chuàng)建私鑰
openssl genrsa -out privatekey.pem 1024 復(fù)制代碼2.2 創(chuàng)建證書(shū)簽名請(qǐng)求(Certificate Signing Request)文件
openssl req -new -key privatekey.pem -out certrequest.csr 復(fù)制代碼2.3 獲取證書(shū)
證書(shū)應(yīng)該是一個(gè)經(jīng)過(guò)證書(shū)授證中心簽名的文件,該證書(shū)文件內(nèi)包含了服務(wù)器端提供的公鑰以及證書(shū)的辦法機(jī)構(gòu)等信息。
openssl x509 -req -in certrequest.csr -signkey privatekey.pem -out certificate.pem 復(fù)制代碼2.4 獲取證書(shū)
在具備了證書(shū)文件后,可以使用該證書(shū)文件創(chuàng)建一個(gè)pfx文件。 所謂pfx文件,是指該文件內(nèi)容必須符合公鑰加密技術(shù)12號(hào)標(biāo)準(zhǔn)。
openssl pkcs12 -export -in certificate.pem -inkey privatekey.pem -out certificate.pfx 復(fù)制代碼2.5 創(chuàng)建服務(wù)器
https.createServer(options,[requestListener]); 復(fù)制代碼- pfx 私鑰、公鑰以及證書(shū)
- key 私鑰
- passphrase 為私鑰指定密碼
- cert 公鑰
- ca 證書(shū),用于指定一組證書(shū),默認(rèn)屬性值為幾個(gè)著名的證書(shū)授權(quán)中心,例如VerlSign
- crl 指定證書(shū)吊銷(xiāo)主
2.6 創(chuàng)建HTTPS客戶端
在https模塊中,可以使用request方法向其它使用HTTPS協(xié)議的網(wǎng)站請(qǐng)求數(shù)據(jù)
let req = https.request(options,callback); 復(fù)制代碼- host 指定域名或目標(biāo)主機(jī)的IP地址
- hostname 指定域名或目標(biāo)主機(jī)的IP地址
- port 端口號(hào)
- method 指定請(qǐng)求方法名
- path 指下請(qǐng)求路徑及查詢字符串
- headers 客戶端請(qǐng)求頭對(duì)象
- auth 指定認(rèn)證信息部分
- agent 指定用戶代理,指定false則從連接池中挑選一個(gè)連接狀態(tài)為關(guān)閉的https.Agent對(duì)象
- pfx 指定私鑰、公鑰和證書(shū)
- key 指定私鑰
- cert 公鑰
- ca 一組證書(shū)
HTTP
- 請(qǐng)求的一方叫客戶端,響應(yīng)的一方叫服務(wù)器端
- 通過(guò)請(qǐng)求和響應(yīng)達(dá)成通信
- HTTP是一種不保存狀態(tài)的協(xié)議
3.1 內(nèi)容協(xié)商
首部字段
- Accept
- Accept-Charset
- Accept-Encoding
- Accept-Language
- Content-Language
協(xié)商類型
- 服務(wù)器驅(qū)動(dòng)
- 客戶端驅(qū)動(dòng)協(xié)商
- 透明協(xié)商
3.2 狀態(tài)碼
狀態(tài)碼負(fù)責(zé)表示客戶端請(qǐng)求的返回結(jié)果、標(biāo)記服務(wù)器端是否正常、通知出現(xiàn)的錯(cuò)誤
3.3 狀態(tài)碼類別
類別 原因短語(yǔ)
- 1XX Informational(信息性狀態(tài)碼)
- 2XX Success(成功狀態(tài)碼)
- 3XX Redirection(重定向)
- 4XX Client Error(客戶端錯(cuò)誤狀態(tài)碼)
- 5XX Server Error(服務(wù)器錯(cuò)誤狀態(tài)嗎)
3.4.1 2XX 成功
- 200(OK 客戶端發(fā)過(guò)來(lái)的數(shù)據(jù)被正常處理
- 204(Not Content 正常響應(yīng),沒(méi)有實(shí)體
- 206(Partial Content 范圍請(qǐng)求,返回部分?jǐn)?shù)據(jù),響應(yīng)報(bào)文中由Content-Range指定實(shí)體內(nèi)容
3.4.2 3XX 重定向
- 301(Moved Permanently) 永久重定向
- 302(Found) 臨時(shí)重定向,規(guī)范要求方法名不變,但是都會(huì)改變
- 303(See Other) 和302類似,但必須用GET方法
- 304(Not Modified) 狀態(tài)未改變 配合(If-Match、If-Modified-Since、If-None_Match、If-Range、If-Unmodified-Since)
- 307(Temporary Redirect) 臨時(shí)重定向,不該改變請(qǐng)求方法
3.4.3 4XX 客戶端錯(cuò)誤
- 400(Bad Request) 請(qǐng)求報(bào)文語(yǔ)法錯(cuò)誤
- 401 (unauthorized) 需要認(rèn)證
- 403(Forbidden) 服務(wù)器拒絕訪問(wèn)對(duì)應(yīng)的資源
- 404(Not Found) 服務(wù)器上無(wú)法找到資源
3.4.4 5XX 服務(wù)器端錯(cuò)誤
- 500(Internal Server Error)服務(wù)器故障
- 503(Service Unavailable) 服務(wù)器處于超負(fù)載或正在停機(jī)維護(hù)
首部
4.1 通用首部字段
| Cache-Control | 控制緩存行為 |
| Connection | 鏈接的管理 |
| Date | 報(bào)文日期 |
| Pragma | 報(bào)文指令 |
| Trailer | 報(bào)文尾部的首部 |
| Trasfer-Encoding | 指定報(bào)文主體的傳輸編碼方式 |
| Upgrade | 升級(jí)為其他協(xié)議 |
| Via | 代理服務(wù)器信息 |
| Warning | 錯(cuò)誤通知 |
4.2 請(qǐng)求首部字段
| Accept | 用戶代理可處理的媒體類型 |
| Accept-Charset | 優(yōu)先的字符集 |
| Accept-Encoding | 優(yōu)先的編碼 |
| Accept-Langulage | 優(yōu)先的語(yǔ)言 |
| Authorization | Web認(rèn)證信息 |
| Expect | 期待服務(wù)器的特定行為 |
| From | 用戶的電子郵箱地址 |
| Host | 請(qǐng)求資源所在的服務(wù)器 |
| If-Match | 比較實(shí)體標(biāo)記 |
| If-Modified-Since | 比較資源的更新時(shí)間 |
| If-None-Match | 比較實(shí)體標(biāo)記 |
| If-Range | 資源未更新時(shí)發(fā)送實(shí)體Byte的范圍請(qǐng)求 |
| If-Unmodified-Since | 比較資源的更新時(shí)間(和If-Modified-Since相反) |
| Max-Forwards | 最大傳輸跳數(shù) |
| Proxy-Authorization | 代理服務(wù)器需要客戶端認(rèn)證 |
| Range | 實(shí)體字節(jié)范圍請(qǐng)求 |
| Referer | 請(qǐng)求中的URI的原始獲取方 |
| TE | 傳輸編碼的優(yōu)先級(jí) |
| User-Agent | HTTP客戶端程序的信息 |
4.3 響應(yīng)首部字段
| Accept-Ranges | 是否接受字節(jié)范圍 |
| Age | 資源的創(chuàng)建時(shí)間 |
| ETag | 資源的匹配信息 |
| Location | 客戶端重定向至指定的URI |
| Proxy-Authenticate | 代理服務(wù)器對(duì)客戶端的認(rèn)證信息 |
| Retry-After | 再次發(fā)送請(qǐng)求的時(shí)機(jī) |
| Server | 服務(wù)器的信息 |
| Vary | 代理服務(wù)器緩存的管理信息 |
| www-Authenticate | 服務(wù)器對(duì)客戶端的認(rèn)證 |
4.4 實(shí)體首部字段
| Allow | 資源可支持的HTTP方法 |
| Content-Encoding | 實(shí)體的編碼方式 |
| Content-Language | 實(shí)體的自然語(yǔ)言 |
| Content-Length | 實(shí)體的內(nèi)容大小(字節(jié)為單位) |
| Content-Location | 替代對(duì)應(yīng)資源的URI |
| Content-MD5 | 實(shí)體的報(bào)文摘要 |
| Content-Range | 實(shí)體的位置范圍 |
| Content-Type | 實(shí)體主體的媒體類型 |
| Expires | 實(shí)體過(guò)期時(shí)間 |
| Last-Modified | 資源的最后修改時(shí)間 |
這些信息頭是做壓縮,緩存,范圍請(qǐng)求等功能的必需條件,想了解的可以看看我寫(xiě)的靜態(tài)服務(wù)。
總結(jié)
- 上一篇: 文件上传至将File转换成MultiPa
- 下一篇: c# 对文件的操作