https原理和iOS的適配(認(rèn)證)

根據(jù)廣大開(kāi)發(fā)者的傳聞,2017年1月1號(hào),蘋(píng)果公司要執(zhí)行ATS政策了。所有app必須強(qiáng)制支持https(不包括一些視頻流媒體的app)。當(dāng)然也沒(méi)說(shuō)不支持的后果,不過(guò)很多人表示,app被強(qiáng)制下架的可能性比較小,頂多就是更新上架的時(shí)候不讓過(guò)而已。不過(guò)盡管如此還是把我們吃瓜群眾給嚇尿了,然后上網(wǎng)各種適配https。

結(jié)果cocochina上又發(fā)文,表示已經(jīng)問(wèn)過(guò)蘋(píng)果了,蘋(píng)果爸爸表示會(huì)延長(zhǎng)截止時(shí)間,給開(kāi)發(fā)者更多的時(shí)間來(lái)適配HTTPS,網(wǎng)上那些的軟文請(qǐng)不要相信。

不過(guò)雖然時(shí)間延長(zhǎng)了,不過(guò)還是早晚的事啊,所以這里就給各位看官講一講HTTPS的那些事。

一、http和https的區(qū)別

引用度娘的一段話

HTTPS和HTTP的區(qū)別

超文本傳輸協(xié)議HTTP協(xié)議被用于在Web瀏覽器和網(wǎng)站服務(wù)器之間傳遞信息。HTTP協(xié)議以明文方式發(fā)送內(nèi)容,不提供任何方式的數(shù)據(jù)加密,如果攻擊者截取了Web瀏覽器和網(wǎng)站服務(wù)器之間的傳輸報(bào)文,就可以直接讀懂其中的信息,因此HTTP協(xié)議不適合傳輸一些敏感信息,比如信用卡號(hào)、密碼等。

為了解決HTTP協(xié)議的這一缺陷,需要使用另一種協(xié)議:安全套接字層超文本傳輸協(xié)議HTTPS。為了數(shù)據(jù)傳輸?shù)陌踩琀TTPS在HTTP的基礎(chǔ)上加入了SSL協(xié)議,SSL依靠證書(shū)來(lái)驗(yàn)證服務(wù)器的身份,并為瀏覽器和服務(wù)器之間的通信加密。

HTTPS和HTTP的區(qū)別主要為以下四點(diǎn):

一、https協(xié)議需要到ca申請(qǐng)證書(shū),一般免費(fèi)證書(shū)很少,需要交費(fèi)。

二、http是超文本傳輸協(xié)議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協(xié)議。

三、http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。

四、http的連接很簡(jiǎn)單,是無(wú)狀態(tài)的;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比http協(xié)議安全。(引自度娘)

上面的那一坨總結(jié)出來(lái)就是,http數(shù)據(jù)為明文傳輸,被攔截后就直接明文可以看到數(shù)據(jù);而https數(shù)據(jù)為加密傳輸,即使被攔截到了,那也是亂碼。當(dāng)然,這里應(yīng)該有抓包過(guò)https的小伙伴表示不服,這個(gè)下面會(huì)說(shuō)到的。

因?yàn)榧由狭诉@一ssl層,所以https在整個(gè)傳輸過(guò)程中,大部分時(shí)間都是消耗在了ssl的認(rèn)證、加密中,所以相比于http,速度還是會(huì)慢一點(diǎn)的,所以上面說(shuō)視頻流媒體的app可以不用強(qiáng)制https,因?yàn)樘臅r(shí)間了。。。

二、https之服務(wù)器簡(jiǎn)單聊一聊

因?yàn)楸救瞬⒉皇欠?wù)器開(kāi)發(fā),所以這個(gè)服務(wù)器這方面就提一下。

要想從http升級(jí)成https,那得先服務(wù)器認(rèn)證。

就是要證明你這個(gè)服務(wù)器,是你所聲明的服務(wù)器。沒(méi)錯(cuò),就像天朝的要證明你是你自己,你證明你媽是你嗎。。。表示心疼需要證明的小伙伴。。。。

那怎么證明你媽是你媽?zhuān)蕖!!2皇牵亲C明你的服務(wù)器,就是你所聲明的服務(wù)器那?你說(shuō)你是百度,我還說(shuō)我是那!!

所以,這里就涉及到了一個(gè)權(quán)威的機(jī)構(gòu)登場(chǎng)CA (Certificate Authority)!!!

采用https的服務(wù)器必須從CA (Certificate Authority)申請(qǐng)一個(gè)用于證明服務(wù)器用途類(lèi)型的證書(shū)。該證書(shū)只有用于對(duì)應(yīng)的服務(wù)器的時(shí)候,客戶(hù)端才信任此主機(jī)。(一般這種證書(shū)都是要花錢(qián)的買(mǎi)的。。。。)

舉個(gè)栗子

你用瀏覽器訪問(wèn)一些網(wǎng)站的時(shí)候,瀏覽器會(huì)自動(dòng)驗(yàn)證網(wǎng)站的證書(shū),如果證書(shū)不是CA簽發(fā)的,那么瀏覽器會(huì)提示提示你,此網(wǎng)站的證書(shū)無(wú)效(因?yàn)椴皇侵付ǖ臋C(jī)構(gòu)簽發(fā)的,有可能是自己簽發(fā)的),如下圖


當(dāng)不是正規(guī)機(jī)構(gòu)簽發(fā)的證書(shū)

有木有人看著眼熟,對(duì),你登錄12306的時(shí)候,有木有!!

堂堂大鐵路局的12306證書(shū)竟然不是正規(guī)機(jī)構(gòu)簽發(fā)的!!要知道瀏覽器連草榴都信任,說(shuō)明草榴的證書(shū)都是正規(guī)買(mǎi)的,12306竟然后還是自己簽發(fā)的。。。就差這點(diǎn)錢(qián)么?

如果服務(wù)器買(mǎi)好了證書(shū)的話,因?yàn)橐咸O(píng)果的ATS政策

·服務(wù)器所有的連接使用TLS1.2以上版本

·HTTPS證書(shū)必須使用SHA256以上哈希算法簽名

·HTTPS證書(shū)必須使用RSA 2048位或ECC 256位以上公鑰算法

還有證書(shū)還要是符合蘋(píng)果認(rèn)同的,最近沃通的證書(shū)好像就快到期了,所以是沃通簽發(fā)的趕緊去重新買(mǎi)。

配置完的可以用這個(gè)來(lái)查看是否符合蘋(píng)果的要求,傳送門(mén)SSL證書(shū) - 騰訊云

三、https流程

其實(shí)百度https,上面就有https的流程(我是傳送門(mén)https_百度百科),所以這里簡(jiǎn)單的說(shuō)下,其中的各種算法、參數(shù)的交換在下面的步驟就不細(xì)說(shuō)了,請(qǐng)自行傳送門(mén)。

這里分https的單向認(rèn)證和雙向認(rèn)證(單向還是雙向這個(gè)需要服務(wù)器去配置的),所以分開(kāi)來(lái)說(shuō),要不小伙伴們會(huì)蒙的

單向認(rèn)證

材料:買(mǎi)來(lái)的服務(wù)器證書(shū)server.cer(客戶(hù)端要放一個(gè),用來(lái)驗(yàn)證服務(wù)端),客戶(hù)端,服務(wù)器。

數(shù)據(jù)加密基本原理:RSA加密+對(duì)稱(chēng)加密(數(shù)據(jù)data經(jīng)對(duì)稱(chēng)密鑰key加密,然后把對(duì)稱(chēng)密鑰key經(jīng)RSA公鑰加密)

1、客戶(hù)端向服務(wù)器發(fā)起請(qǐng)求。

2、服務(wù)器響應(yīng)到請(qǐng)求,同時(shí)把服務(wù)器的證書(shū)發(fā)給客戶(hù)端。

3、客戶(hù)端接收到證書(shū),然后和客戶(hù)端中的證書(shū)對(duì)比,如果證書(shū)不一致或者無(wú)效,那么斷開(kāi)連接。如果通過(guò),那么進(jìn)行第四部。

4、用戶(hù)產(chǎn)生一個(gè)隨機(jī)密鑰,然后經(jīng)服務(wù)器證書(shū)中的公鑰進(jìn)行加密,傳給服務(wù)端。

5、服務(wù)端拿到加密數(shù)據(jù)和加密密鑰,用服務(wù)器的私鑰解開(kāi)密鑰,得到對(duì)稱(chēng)密鑰key。

6、服務(wù)端和客戶(hù)端互相通訊指定這個(gè)密鑰為加密密鑰。握手結(jié)束

7、客戶(hù)端和服務(wù)端開(kāi)始通訊,通訊數(shù)據(jù)由對(duì)稱(chēng)密鑰加密。

簡(jiǎn)易圖(對(duì)付看吧)


雙向認(rèn)證

雙向認(rèn)證比單向認(rèn)證多了一步,就是服務(wù)器要認(rèn)證客戶(hù)端,按照百度百科上的步驟,客戶(hù)端應(yīng)該有一個(gè)由CA(或正規(guī)機(jī)構(gòu))簽發(fā)的p12證書(shū),和CA根證書(shū)(簽名的p12就是由這個(gè)簽名的)

//上面的CA根證書(shū)和p12證書(shū) ? 其實(shí)都可以自簽的,下面介紹的也是自簽的

材料:買(mǎi)來(lái)的服務(wù)器證書(shū)server.cer(客戶(hù)端要放一個(gè),用來(lái)驗(yàn)證服務(wù)端),客戶(hù)端,服務(wù)器端,CA的根證書(shū)(放到服務(wù)器中,用來(lái)驗(yàn)證客戶(hù)端的證書(shū)),p12證書(shū)(用來(lái)放到客戶(hù)端,網(wǎng)絡(luò)請(qǐng)求的時(shí)候會(huì)傳給服務(wù)端)。

步驟:就是在上面第4步的時(shí)候,要用p12文件來(lái)對(duì)一段數(shù)據(jù)進(jìn)行簽名,然后把簽名和p12證書(shū),加密的對(duì)稱(chēng)密鑰(上面的說(shuō)過(guò)的)傳給服務(wù)器,然后服務(wù)器接到以后,會(huì)用CA根證書(shū)(或自簽的根證書(shū))來(lái)對(duì)證書(shū)和簽名數(shù)據(jù)進(jìn)行驗(yàn)證,如果正確,通訊繼續(xù),否則,斷開(kāi)連接。

其他的都是一樣的。

四、自簽證書(shū)的過(guò)程

p12和CA根證書(shū),其實(shí)也可以自簽的,現(xiàn)在說(shuō)下自簽的過(guò)程。

首先,先有個(gè)工具,xca

xca

就是這個(gè)東西,然后安裝以后

xca界面


首先,先生生成一個(gè)datacode


新建database


填寫(xiě)database名字和存放地址


設(shè)置database的密碼,并確認(rèn)

然后就會(huì)生成一個(gè)這個(gè)東西

然后根據(jù)這個(gè)database生成一個(gè)CA根證書(shū)(當(dāng)然,是自簽的了)


根證書(shū)ca設(shè)置
根證書(shū)的具體設(shè)置


根證書(shū)CA私鑰的設(shè)置

直接點(diǎn)確定,然后就會(huì)提示你privatekey創(chuàng)建好了,然后直接確定到下面這個(gè)圖

根證書(shū)創(chuàng)建成功后會(huì)在xca中顯示出來(lái)的

然后導(dǎo)出CA根證書(shū)

根證書(shū)CA的導(dǎo)出


就是它

這時(shí)候,自簽的CA根證書(shū)就創(chuàng)建好了,這個(gè)CA證書(shū)是要放到服務(wù)器上的。一般默認(rèn)的CA證書(shū)時(shí)間是10年。

然后這時(shí)候,就要?jiǎng)?chuàng)建自簽的p12證書(shū)了。選中這個(gè)CA證書(shū),然后

創(chuàng)建p12證書(shū)


設(shè)置p12證書(shū)的源頭

然后subject里面和設(shè)置CA證書(shū)一樣。

p12證書(shū)默認(rèn)是一年的,如果感覺(jué)短的話 ? 可以在Extensions中設(shè)置時(shí)間。

然后把P12證書(shū)放到客戶(hù)端項(xiàng)目里。

五、iOS端的https雙向適配

AFN的https的雙向適配2.x和3.0不一樣,先說(shuō)3.0

客戶(hù)端認(rèn)證服務(wù)端,

shareManager = [AFHTTPSessionManager manager];

shareManager.securityPolicy = [self customSecurityPolicyWithCerName:HPWalletServerCerName];//調(diào)用方法

//客戶(hù)端認(rèn)證服務(wù)端的方法

+ (AFSecurityPolicy *)customSecurityPolicyWithCerName:(NSString *)cerName{

//導(dǎo)入證書(shū)路徑

NSString *cerPath = [[NSBundle mainBundle] pathForResource:cerName ofType:@""];

//加載證書(shū)

NSData *cerData = [NSData dataWithContentsOfFile:cerPath];

NSSet *certSet = [NSSet setWithObject:cerData];

//使用AFSSLPinningModeCertificate證書(shū)驗(yàn)證模式

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:certSet];

//allowInvalidCertificates 是否允許無(wú)效證書(shū)(也就是自建的證書(shū)),默認(rèn)為NO

//如果是需要驗(yàn)證自建證書(shū),需要設(shè)置為YES

securityPolicy.allowInvalidCertificates = NO;

//是否需要驗(yàn)證域名,默認(rèn)為YES

//假如證書(shū)的域名與你請(qǐng)求的域名不一致,需把該項(xiàng)設(shè)置為NO;如設(shè)成NO的話,即服務(wù)器使用其他可信任機(jī)構(gòu)頒發(fā)的證書(shū),也可以建立連接,這個(gè)非常危險(xiǎn),建議打開(kāi)。

//置為NO,主要用于這種情況:客戶(hù)端請(qǐng)求的是子域名,而證書(shū)上的是另外一個(gè)域名。因?yàn)镾SL證書(shū)上的域名是獨(dú)立的,假如證書(shū)上注冊(cè)的域名是www.google.com,那么mail.google.com是無(wú)法驗(yàn)證通過(guò)的;當(dāng)然,有錢(qián)可以注冊(cè)通配符的域名*.google.com,但這個(gè)還是比較貴的。

//如置為NO,建議自己添加對(duì)應(yīng)域名的校驗(yàn)邏輯。

securityPolicy.validatesDomainName = YES;

return securityPolicy;

}

重寫(xiě)AFN的方法 ?來(lái)讓服務(wù)器認(rèn)證客戶(hù)端

{//新的https

shareManager.securityPolicy = [self customSecurityPolicyWithCerName:HPWalletServerCerName];

//客戶(hù)端請(qǐng)求驗(yàn)證,重寫(xiě)setSessionDidReceiveAuthenticationChallengeBlock方法

[shareManager setSessionDidReceiveAuthenticationChallengeBlock:^NSURLSessionAuthChallengeDisposition(NSURLSession *session, NSURLAuthenticationChallenge *challenge, NSURLCredential *__autoreleasing *_credential) {

NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling;

__autoreleasing NSURLCredential *credential = nil;

if([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {

if([shareManager.securityPolicy evaluateServerTrust:challenge.protectionSpace.serverTrust forDomain:challenge.protectionSpace.host]) {

credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];

if(credential) {

disposition =NSURLSessionAuthChallengeUseCredential;

} else {

disposition =NSURLSessionAuthChallengePerformDefaultHandling;

}

} else {

disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge;

}

} else {

// client authentication

SecIdentityRef identity = NULL;

SecTrustRef trust = NULL;

NSString *p12 = [[NSBundle mainBundle] pathForResource:@"p12文件的名字" ofType:@"p12"];

NSFileManager *fileManager =[NSFileManager defaultManager];

if(![fileManager fileExistsAtPath:p12]) {

NSLog(@"hpwallet-client.p12:not exist");

} else {

NSData *PKCS12Data = [NSData dataWithContentsOfFile:p12];

if ([[self class] extractIdentity:&identity andTrust:&trust fromPKCS12Data:PKCS12Data]) {

SecCertificateRef certificate = NULL;

SecIdentityCopyCertificate(identity, &certificate);

const void *certs[] = {certificate};

CFArrayRef certArray =CFArrayCreate(kCFAllocatorDefault, certs,1,NULL);

credential =[NSURLCredential credentialWithIdentity:identity certificates:(__bridge ?NSArray*)certArray persistence:NSURLCredentialPersistencePermanent];

disposition =NSURLSessionAuthChallengeUseCredential;

}

}

}

*_credential = credential;

return disposition;

}];

}


+ (BOOL)extractIdentity:(SecIdentityRef *)outIdentity andTrust:(SecTrustRef *)outTrust fromPKCS12Data:(NSData *)inPKCS12Data {

OSStatus securityError = errSecSuccess;

//client certificate password

NSDictionary*optionsDictionary = [NSDictionary dictionaryWithObject:@“p12的密碼“ forKey:(__bridge id)kSecImportExportPassphrase];

CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);

securityError = SecPKCS12Import((__bridge CFDataRef)inPKCS12Data,(__bridge CFDictionaryRef)optionsDictionary,&items);

if(securityError == 0) {

CFDictionaryRef myIdentityAndTrust =CFArrayGetValueAtIndex(items,0);

const void*tempIdentity =NULL;

tempIdentity= CFDictionaryGetValue (myIdentityAndTrust,kSecImportItemIdentity);

*outIdentity = (SecIdentityRef)tempIdentity;

const void*tempTrust =NULL;

tempTrust = CFDictionaryGetValue(myIdentityAndTrust,kSecImportItemTrust);

*outTrust = (SecTrustRef)tempTrust;

} else {

NSLog(@"Failedwith error code %d",(int)securityError);

return NO;

}

return YES;

}


AFN2.x適配

客戶(hù)端認(rèn)證服務(wù)器

manage.securityPolicy = [HttpServiceAFNetworkImp customSecurityPolicy];

+ (AFSecurityPolicy *)customSecurityPolicy

{

NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"服務(wù)器.cer證書(shū)的名字"ofType:@"der"];

NSData *cerData = [NSData dataWithContentsOfFile:cerPath];

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];

//allowInvalidCertificates 是否允許無(wú)效證書(shū)(也就是自建的證書(shū)),默認(rèn)為NO

//如果是需要驗(yàn)證自建證書(shū),需要設(shè)置為YES

securityPolicy.allowInvalidCertificates = NO;

//是否需要驗(yàn)證域名,默認(rèn)為YES

//假如證書(shū)的域名與你請(qǐng)求的域名不一致,需把該項(xiàng)設(shè)置為NO;如設(shè)成NO的話,即服務(wù)器使用其他可信任機(jī)構(gòu)頒發(fā)的證書(shū),也可以建立連接,這個(gè)非常危險(xiǎn),建議打開(kāi)。

//置為NO,主要用于這種情況:客戶(hù)端請(qǐng)求的是子域名,而證書(shū)上的是另外一個(gè)域名。因?yàn)镾SL證書(shū)上的域名是獨(dú)立的,假如證書(shū)上注冊(cè)的域名是www.google.com,那么mail.google.com是無(wú)法驗(yàn)證通過(guò)的;當(dāng)然,有錢(qián)可以注冊(cè)通配符的域名*.google.com,但這個(gè)還是比較貴的。

//如置為NO,建議自己添加對(duì)應(yīng)域名的校驗(yàn)邏輯。

securityPolicy.validatesDomainName = YES;

//放入證書(shū)

securityPolicy.pinnedCertificates = @[cerData];

return securityPolicy;

}


服務(wù)器認(rèn)證客戶(hù)端,這個(gè)要把AFN的AFURLConnectionOperation.m文件中 ?- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge方法替換掉 ?替換成

- (void)connection:(NSURLConnection *)connection

willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge

{

NSString *thePath = [[NSBundle mainBundle] pathForResource:@"client" ofType:@"p12"];

//倒入證書(shū) ? ? ? NSLog(@"thePath===========%@",thePath);

NSData *PKCS12Data = [[NSData alloc] initWithContentsOfFile:thePath];

CFDataRef inPKCS12Data = (__bridge CFDataRef)PKCS12Data;

SecIdentityRef identity = NULL;

// extract the ideneity from the certificate

[self extractIdentity :inPKCS12Data toIdentity:&identity];

SecCertificateRef certificate = NULL;

SecIdentityCopyCertificate (identity, &certificate);

const void *certs[] = {certificate};

// ? ? ? ? ? ? ? ? ? ? ? ?CFArrayRef certArray = CFArrayCreate(kCFAllocatorDefault, certs, 1, NULL);

// create a credential from the certificate and ideneity, then reply to the challenge with the credential

//NSLog(@"identity=========%@",identity);

NSURLCredential *credential = [NSURLCredential credentialWithIdentity:identity certificates:nil persistence:NSURLCredentialPersistencePermanent];

// ? ? ? ? ? credential = [NSURLCredential credentialWithIdentity:identity certificates:(__bridge NSArray*)certArray persistence:NSURLCredentialPersistencePermanent];

[challenge.sender useCredential:credential forAuthenticationChallenge:challenge];

}

并添加下面的方法

- (OSStatus)extractIdentity:(CFDataRef)inP12Data toIdentity:(SecIdentityRef*)identity {

OSStatus securityError = errSecSuccess;

CFStringRef password = CFSTR("證書(shū)密碼");

const void *keys[] = { kSecImportExportPassphrase };

const void *values[] = { password };

CFDictionaryRef options = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL);

CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);

securityError = SecPKCS12Import(inP12Data, options, &items);

if (securityError == 0)

{

CFDictionaryRef ident = CFArrayGetValueAtIndex(items,0);

const void *tempIdentity = NULL;

tempIdentity = CFDictionaryGetValue(ident, kSecImportItemIdentity);

*identity = (SecIdentityRef)tempIdentity;

}

if (options) {

CFRelease(options);

}

return securityError;

}


就好了 ?大功搞成,好長(zhǎng)啊。。。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評(píng)論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,634評(píng)論 3 419
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,653評(píng)論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,063評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,835評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,235評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評(píng)論 3 442
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,459評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,000評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,819評(píng)論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,004評(píng)論 1 370
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,257評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,676評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,937評(píng)論 1 288
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,717評(píng)論 3 393
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,003評(píng)論 2 374

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