也許,這樣理解HTTPS更容易

原文地址

摘要:本文嘗試一步步還原HTTPS的設(shè)計(jì)過程藤为,以理解為什么HTTPS最終會(huì)是這副模樣怪与。但是這并不代表HTTPS的真實(shí)設(shè)計(jì)過程。在閱讀本文時(shí)缅疟,你可以嘗試放下已有的對(duì)HTTPS的理解分别,這樣更利于“還原”過程。
我們先不了聊HTTP存淫,HTTPS耘斩,我們先從一個(gè)聊天軟件說起,我們要實(shí)現(xiàn)A能發(fā)一個(gè)hello消息給B:


如果我們要實(shí)現(xiàn)這個(gè)聊天軟件桅咆,本文只考慮安全性問題括授,要實(shí)現(xiàn)
A發(fā)給B的hello消息包,即使被中間人攔截到了岩饼,也無法得知消息的內(nèi)容

如何做到真正的安全荚虚?
這個(gè)問題,很多人馬上就想到了各種加密算法籍茧,什么對(duì)稱加密版述、非對(duì)稱加密、DES硕糊、RSA院水、XX腊徙、噼里啪啦~
而我想說简十,加密算法只是解決方案檬某,我們首先要做的是理解我們的問題域——什么是安全?
我個(gè)人的理解是:
A與B通信的內(nèi)容螟蝙,有且只有A和B有能力看到通信的真正內(nèi)容

好恢恼,問題域已經(jīng)定義好了(現(xiàn)實(shí)中當(dāng)然不止這一種定義)。對(duì)于解決方案胰默,很容易就想到了對(duì)消息進(jìn)行加密场斑。
題外話,但是只有這一種方法嗎牵署?我看未必漏隐,說不定在將來會(huì)出現(xiàn)一種物質(zhì)打破當(dāng)前世界的通信假設(shè),實(shí)現(xiàn)真正意義上的保密奴迅。
對(duì)于A與B這樣的簡(jiǎn)單通信模型青责,我們很容易做出選擇:

對(duì)稱加密算法

這就是對(duì)稱加密算法,其中圖中的密鑰S同時(shí)扮演加密和解密的角色取具。具體細(xì)節(jié)不是本文范疇脖隶。
只要這個(gè)密鑰S不公開給第三者,同時(shí)密鑰S足夠安全暇检,我們就解決了我們一開始所定問題域了产阱。因?yàn)槭澜缟嫌星抑挥蠥與B知道如何加密和解密他們之間的消息。
但是块仆,在WWW環(huán)境下构蹬,我們的Web服務(wù)器的通信模型沒有這么簡(jiǎn)單:
Web服務(wù)器使用對(duì)稱加密算法

如果服務(wù)器端對(duì)所有的客戶端通信都使用同樣的對(duì)稱加密算法,無異于沒有加密悔据。那怎么辦呢庄敛?即能使用對(duì)稱加密算法,又不公開密鑰蜜暑?請(qǐng)讀者思考21秒鐘铐姚。??
答案是:Web服務(wù)器與每個(gè)客戶端使用不同的對(duì)稱加密算法:
Web服務(wù)器與每個(gè)客戶端使用不同對(duì)稱加密算法

如何確定對(duì)稱加密算法
慢著,另一個(gè)問題來了肛捍,我們的服務(wù)器端怎么告訴客戶端該使用哪種對(duì)稱加密算法隐绵?
當(dāng)然是通過協(xié)商。
協(xié)商對(duì)稱加密算法

但是拙毫,你協(xié)商的過程是沒有加密的依许,還是會(huì)被中間人攔截。那我們?cè)賹?duì)這個(gè)協(xié)商過程進(jìn)行對(duì)稱加密就好了缀蹄,那你對(duì)協(xié)商過程加密的加密還是沒有加密峭跳,怎么辦膘婶?再加密不就好了……好吧,進(jìn)行雞生蛋蛋生雞的問題了蛀醉。
如何對(duì)協(xié)商過程進(jìn)行加密
新問題來了悬襟,如何對(duì)協(xié)商過程進(jìn)行加密?密碼學(xué)領(lǐng)域中拯刁,有一種稱為“非對(duì)稱加密”的加密算法脊岳,特點(diǎn)是私鑰加密后的密文,只要是公鑰垛玻,都可以解密割捅,但是公鑰加密后的密文,只有私鑰可以解密帚桩。私鑰只有一個(gè)人有亿驾,而公鑰可以發(fā)給所有的人
非對(duì)稱加密

雖然服務(wù)器端向A账嚎、B……的方向還是不安全的莫瞬,但是至少A、B向服務(wù)器端方向是安全的醉锄。
好了乏悄,如何協(xié)商加密算法的問題,我們解決了:使用非對(duì)稱加密算法進(jìn)行對(duì)稱加密算法協(xié)商過程恳不。
這下檩小,你明白為什么HTTPS同時(shí)需要對(duì)稱加密算法和非對(duì)稱加密算法了吧?
協(xié)商什么加密算法
要達(dá)到Web服務(wù)器針對(duì)每個(gè)客戶端使用不同的對(duì)稱加密算法烟勋,同時(shí)规求,我們也不能讓第三者知道這個(gè)對(duì)稱加密算法是什么,怎么辦卵惦?
使用隨機(jī)數(shù)阻肿,就是使用隨機(jī)數(shù)來生成對(duì)稱加密算法。這樣就可以做到服務(wù)器和客戶端每次交互都是新的加密算法沮尿、只有在交互的那一該才確定加密算法丛塌。
這下,你明白為什么HTTPS協(xié)議握手階段會(huì)有這么多的隨機(jī)數(shù)了吧畜疾。
如何得到公鑰赴邻?
細(xì)心的人可能已經(jīng)注意到了如果使用非對(duì)稱加密算法,我們的客戶端A啡捶,B需要一開始就持有公鑰姥敛,要不沒法開展加密行為啊。
這下瞎暑,我們又遇到新問題了彤敛,如何讓A与帆、B客戶端安全地得到公鑰?
我能想到的方案只有這些:
方案1. 服務(wù)器端將公鑰發(fā)送給每一個(gè)客戶端
方案2. 服務(wù)器端將公鑰放到一個(gè)遠(yuǎn)程服務(wù)器墨榄,客戶端可以請(qǐng)求得到
我們選擇方案1玄糟,因?yàn)榉桨?又多了一次請(qǐng)求,還要另外處理公鑰的放置問題渠概。
公鑰被調(diào)包了怎么辦茶凳?又是一個(gè)雞生蛋蛋生雞問題嫂拴?
但是方案1有個(gè)問題:如果服務(wù)器端發(fā)送公鑰給客戶端時(shí)播揪,被中間人調(diào)包了,怎么辦筒狠?
我畫了張圖方便理解:
中間人將公鑰攔截了

顯然猪狈,讓每個(gè)客戶端的每個(gè)瀏覽器默認(rèn)保存所有網(wǎng)站的公鑰是不現(xiàn)實(shí)的。
使用第三方機(jī)構(gòu)的公鑰解決雞生蛋蛋生雞問題
公鑰被調(diào)包的問題出現(xiàn)辩恼,是因?yàn)槲覀兊目蛻舳藷o法分辨返回公鑰的人到底是中間人雇庙,還是真的服務(wù)器。這其實(shí)就是密碼學(xué)中提的身份驗(yàn)證問題灶伊。
如果讓你來解決疆前,你怎么解決?如果你了解過HTTPS聘萨,會(huì)知道使用數(shù)字證書來解決竹椒。但是你想過證書的本質(zhì)是什么么?請(qǐng)放下你對(duì)HTTPS已有的知識(shí)米辐,自己嘗試找到解決方案胸完。
我是這樣解決的。既然服務(wù)器需要將公鑰傳給客戶端翘贮,這個(gè)過程本身是不安全赊窥,那么我們?yōu)槭裁床粚?duì)這個(gè)過程本身再加密一次?可是狸页,你是使用對(duì)稱加密锨能,還是非對(duì)稱加密?這下好了芍耘,我感覺又進(jìn)了雞生蛋蛋生雞問題了址遇。
問題的難點(diǎn)是如果我們選擇直接將公鑰傳遞給客戶端的方案,我們始終無法解決公鑰傳遞被中間人調(diào)包的問題齿穗。
所以傲隶,我們不能直接將服務(wù)器的公鑰傳遞給客戶端,而是第三方機(jī)構(gòu)使用它的私鑰對(duì)我們的公鑰進(jìn)行加密后窃页,再傳給客戶端跺株「幢簦客戶端再使用第三方機(jī)構(gòu)的公鑰進(jìn)行解密。
下圖就是我們?cè)O(shè)計(jì)的第一版“數(shù)字證書”乒省,證書中只有服務(wù)器交給第三方機(jī)構(gòu)的公鑰巧颈,而且這個(gè)公鑰被第三方機(jī)構(gòu)的私鑰加密了:
第一版數(shù)字證書的內(nèi)容

如果能解密,就說明這個(gè)公鑰沒有被中間人調(diào)包袖扛。因?yàn)槿绻虚g人使用自己的私鑰加密后的東西傳給客戶端砸泛,客戶端是無法使用第三方的公鑰進(jìn)行解密的。
開始引入第三方機(jī)構(gòu)

話到此蛆封,我以為解決問題了唇礁。但是現(xiàn)實(shí)中HTTPS,還有一個(gè)數(shù)字簽名的概念惨篱,我沒法理解它的設(shè)計(jì)理由盏筐。
原來,我漏掉了一個(gè)場(chǎng)景:第三方機(jī)構(gòu)不可能只給你一家公司制作證書砸讳,它也可能會(huì)給中間人這樣有壞心思的公司發(fā)放證書琢融。這樣的,中間人就有機(jī)會(huì)對(duì)你的證書進(jìn)行調(diào)包簿寂,客戶端在這種情況下是無法分辨出是接收的是你的證書漾抬,還是中間人的。因?yàn)椴徽撝虚g人常遂,還是你的證書纳令,都能使用第三方機(jī)構(gòu)的公鑰進(jìn)行解密。像下面這樣:
第三方機(jī)構(gòu)向多家公司頒發(fā)證書的情況:
第三方機(jī)構(gòu)向多家公司頒發(fā)證書的情況

客戶端能解密同一家第三機(jī)構(gòu)頒發(fā)的所有證書:
客戶端能解密同一家第三機(jī)構(gòu)頒發(fā)的所有證書

最終導(dǎo)致其它持有同一家第三方機(jī)構(gòu)證書的中間人可以進(jìn)行調(diào)包:
證書依然可以被中間人調(diào)包

數(shù)字簽名烈钞,解決同一機(jī)構(gòu)頒發(fā)的不同證書被篡改問題
要解決這個(gè)問題泊碑,我們首先要想清楚一個(gè)問題,辨別同一機(jī)構(gòu)下不同證書的這個(gè)職責(zé)毯欣,我們應(yīng)該放在哪馒过?
只能放到客戶端了。意思是酗钞,客戶端在拿到證書后腹忽,自己就有能力分辨證書是否被篡改了。如何才能有這個(gè)能力呢砚作?
我們從現(xiàn)實(shí)中找靈感窘奏。比如你是HR,你手上拿到候選人的學(xué)歷證書葫录,證書上寫了持證人着裹,頒發(fā)機(jī)構(gòu),頒發(fā)時(shí)間等等米同,同時(shí)證書上骇扇,還寫有一個(gè)最重要的:證書編號(hào)摔竿!我們?cè)趺磋b別這張證書是的真?zhèn)文兀恐灰弥@個(gè)證書編號(hào)上相關(guān)機(jī)構(gòu)去查少孝,如果證書上的持證人與現(xiàn)實(shí)的這個(gè)候選人一致继低,同時(shí)證書編號(hào)也能對(duì)應(yīng)上,那么就說明這個(gè)證書是真實(shí)的稍走。
我們的客戶端能不能采用這個(gè)機(jī)制呢袁翁?像這樣:

可是,這個(gè)“第三方機(jī)構(gòu)”到底是在哪呢婿脸?是一個(gè)遠(yuǎn)端服務(wù)粱胜?不可能吧?如果是個(gè)遠(yuǎn)端服務(wù)盖淡,整個(gè)交互都會(huì)慢了年柠。所以,這個(gè)第三方機(jī)構(gòu)的驗(yàn)證功能只能放在客戶端的本地了褪迟。
客戶端本地怎么驗(yàn)證證書呢?
客戶端本地怎么驗(yàn)證證書呢答憔?答案是證書本身就已經(jīng)告訴客戶端怎么驗(yàn)證證書的真?zhèn)巍?br> 也就是證書上寫著如何根據(jù)證書的內(nèi)容生成證書編號(hào)味赃。客戶端拿到證書后根據(jù)證書上的方法自己生成一個(gè)證書編號(hào)虐拓,如果生成的證書編號(hào)與證書上的證書編號(hào)相同心俗,那么說明這個(gè)證書是真實(shí)的。
同時(shí)蓉驹,為避免證書編號(hào)本身又被調(diào)包城榛,所以使用第三方的私鑰進(jìn)行加密。
這地方有些抽象态兴,我們來個(gè)圖幫助理解:
證書的制作如圖所示狠持。證書中的“編號(hào)生成方法MD5”就是告訴客戶端:你使用MD5對(duì)證書的內(nèi)容求值就可以得到一個(gè)證書編號(hào)。

當(dāng)客戶端拿到證書后瞻润,開始對(duì)證書中的內(nèi)容進(jìn)行驗(yàn)證喘垂,如果客戶端計(jì)算出來的證書編號(hào)與證書中的證書編號(hào)相同,則驗(yàn)證通過:

但是第三方機(jī)構(gòu)的公鑰怎么跑到了客戶端的機(jī)器中呢绍撞?世界上這么多機(jī)器正勒。
其實(shí)呢,現(xiàn)實(shí)中傻铣,瀏覽器和操作系統(tǒng)都會(huì)維護(hù)一個(gè)權(quán)威的第三方機(jī)構(gòu)列表(包括它們的公鑰)章贞。因?yàn)榭蛻舳私邮盏降淖C書中會(huì)寫有頒發(fā)機(jī)構(gòu),客戶端就根據(jù)這個(gè)頒發(fā)機(jī)構(gòu)的值在本地找相應(yīng)的公鑰非洲。
題外話:如果瀏覽器和操作系統(tǒng)這道防線被破了鸭限,就沒辦法就谜。想想當(dāng)年自己裝過的非常規(guī)XP系統(tǒng),都害怕里覆。

說到這里丧荐,想必大家已經(jīng)知道上文所說的,證書就是HTTPS中數(shù)字證書喧枷,證書編號(hào)就是數(shù)字簽名虹统,而第三方機(jī)構(gòu)就是指數(shù)字證書簽發(fā)機(jī)構(gòu)(CA)。
CA如何頒發(fā)數(shù)字證書給服務(wù)器端的隧甚?
當(dāng)我聽到這個(gè)問題時(shí)车荔,我誤以為,我們的SERVER需要發(fā)網(wǎng)絡(luò)請(qǐng)求到CA部門的服務(wù)器來拿這個(gè)證書戚扳。?? 到底是我理解能力問題忧便,還是。帽借。
其實(shí)珠增,問題應(yīng)該是CA如何頒發(fā)給我們的網(wǎng)站管理員,而我們的管理員又如何將這個(gè)數(shù)字證書放到我們的服務(wù)器上砍艾。

我們?nèi)绾蜗駽A申請(qǐng)呢蒂教?每個(gè)CA機(jī)構(gòu)都大同小異,我在網(wǎng)上找了一個(gè):
申請(qǐng)數(shù)字證書

拿到證書后脆荷,我們就可以將證書配置到自己的服務(wù)器上了凝垛。那么如何配置?這是具體細(xì)節(jié)了蜓谋,留給大家google了梦皮。
也許我們需要整理一下思路
我們通過推算的方式嘗試還原HTTPS的設(shè)計(jì)過程。這樣桃焕,我們也就明白了為什么HTTPS比HTTP多那么多次的交互剑肯,為什么HTTPS的性能會(huì)差,以及找到HTTPS的性能優(yōu)化點(diǎn)覆旭。

而上面一大堆工作都是為了讓客戶端與服務(wù)器端安全地協(xié)商出一個(gè)對(duì)稱加密算法退子。這就是HTTPS中的SSL/TLS協(xié)議主要干的活。剩下的就是通信時(shí)雙方使用這個(gè)對(duì)稱加密算法進(jìn)行加密解密型将。

總結(jié):

HTTPS的協(xié)議組成:HTTP協(xié)議和SSL/TLS協(xié)議寂祥。HTTP協(xié)議就不用講了,而SSL/TLS就是負(fù)責(zé)加密解密等安全處理的模塊七兜,所以HTTPS的核心在SSL/TLS上面丸凭。整個(gè)通信如下:

1、瀏覽器發(fā)起往服務(wù)器的443端口發(fā)起請(qǐng)求,請(qǐng)求攜帶了瀏覽器支持的加密算法和哈希算法惜犀。

2铛碑、服務(wù)器收到請(qǐng)求,選擇瀏覽器支持的加密算法和哈希算法虽界。

3汽烦、服務(wù)器下將數(shù)字證書返回給瀏覽器,這里的數(shù)字證書可以是向某個(gè)可靠機(jī)構(gòu)申請(qǐng)的莉御,也可以是自制的撇吞。

4、瀏覽器進(jìn)入數(shù)字證書認(rèn)證環(huán)節(jié)礁叔,這一部分是瀏覽器內(nèi)置的TLS完成的:

4.1 首先瀏覽器會(huì)從內(nèi)置的證書列表中索引牍颈,找到服務(wù)器下發(fā)證書對(duì)應(yīng)的機(jī)構(gòu),如果沒有找到琅关,此時(shí)就會(huì)提示用戶該證書是不是由權(quán)威機(jī)構(gòu)頒發(fā)煮岁,是不可信任的。如果查到了對(duì)應(yīng)的機(jī)構(gòu)涣易,則取出該機(jī)構(gòu)頒發(fā)的公鑰画机。

4.2 用機(jī)構(gòu)的證書公鑰解密得到證書的內(nèi)容和證書簽名,內(nèi)容包括網(wǎng)站的網(wǎng)址都毒、網(wǎng)站的公鑰色罚、證書的有效期等。瀏覽器會(huì)先驗(yàn)證證書簽名的合法性账劲。簽名通過后,瀏覽器驗(yàn)證證書記錄的網(wǎng)址是否和當(dāng)前網(wǎng)址是一致的金抡,不一致會(huì)提示用戶瀑焦。如果網(wǎng)址一致會(huì)檢查證書有效期,證書過期了也會(huì)提示用戶梗肝。這些都通過認(rèn)證時(shí)榛瓮,瀏覽器就可以安全使用證書中的網(wǎng)站公鑰了。

4.3 瀏覽器生成一個(gè)隨機(jī)數(shù)R侵俗,并使用網(wǎng)站公鑰對(duì)R進(jìn)行加密冻河。

5贞间、瀏覽器將加密的R傳送給服務(wù)器。

6粹懒、服務(wù)器用自己的私鑰解密得到R。

7顷级、服務(wù)器以R為密鑰使用了對(duì)稱加密算法加密網(wǎng)頁內(nèi)容并傳輸給瀏覽器凫乖。

8、瀏覽器以R為密鑰使用之前約定好的解密算法獲取網(wǎng)頁內(nèi)容。

備注1:前5步其實(shí)就是HTTPS的握手過程帽芽,這個(gè)過程主要是認(rèn)證服務(wù)端證書(內(nèi)置的公鑰)的合法性删掀。因?yàn)榉菍?duì)稱加密計(jì)算量較大,整個(gè)通信過程只會(huì)用到一次非對(duì)稱加密算法(主要是用來保護(hù)傳輸客戶端生成的用于對(duì)稱加密的隨機(jī)數(shù)私鑰)导街。后續(xù)內(nèi)容的加解密都是通過一開始約定好的對(duì)稱加密算法進(jìn)行的披泪。

備注2:SSL/TLS是HTTPS安全性的核心模塊,TLS的前身是SSL搬瑰,TLS1.0就是SSL3.1款票,TLS1.1是SSL3.2,TLS1.2則是SSL3.3跌捆。 SSL/TLS是建立在TCP協(xié)議之上徽职,因而也是應(yīng)用層級(jí)別的協(xié)議。其包括TLS Record Protocol和TLS Handshaking Protocols兩個(gè)模塊佩厚,后者負(fù)責(zé)握手過程中的身份認(rèn)證姆钉,前者則保證數(shù)據(jù)傳輸過程中的完整性和私密性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抄瓦,一起剝皮案震驚了整個(gè)濱河市潮瓶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钙姊,老刑警劉巖毯辅,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異煞额,居然都是意外死亡思恐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門膊毁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胀莹,“玉大人,你說我怎么就攤上這事婚温∶柩妫” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵栅螟,是天一觀的道長荆秦。 經(jīng)常有香客問我,道長力图,這世上最難降的妖魔是什么步绸? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮搪哪,結(jié)果婚禮上靡努,老公的妹妹穿的比我還像新娘坪圾。我一直安慰自己,他們只是感情好惑朦,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布兽泄。 她就那樣靜靜地躺著,像睡著了一般漾月。 火紅的嫁衣襯著肌膚如雪病梢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天梁肿,我揣著相機(jī)與錄音蜓陌,去河邊找鬼。 笑死吩蔑,一個(gè)胖子當(dāng)著我的面吹牛钮热,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播烛芬,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼隧期,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了赘娄?” 一聲冷哼從身側(cè)響起仆潮,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎遣臼,沒想到半個(gè)月后性置,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡揍堰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年鹏浅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屏歹。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡篡石,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出西采,到底是詐尸還是另有隱情,我是刑警寧澤继控,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布械馆,位于F島的核電站,受9級(jí)特大地震影響武通,放射性物質(zhì)發(fā)生泄漏霹崎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一冶忱、第九天 我趴在偏房一處隱蔽的房頂上張望尾菇。 院中可真熱鬧,春花似錦、人聲如沸派诬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽默赂。三九已至沛鸵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缆八,已是汗流浹背曲掰。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奈辰,地道東北人栏妖。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像奖恰,于是被迫代替她去往敵國和親吊趾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容