CocoaHttpServer 實(shí)現(xiàn)https

前言

蘋果在iOS9中加入了ATS锦募,不清楚的同學(xué)點(diǎn)擊任意門ATS適配, 當(dāng)然這個其實(shí)也是蠻好的鲸郊,安全嘛榨汤,這篇文章的主題是講如何用CocoaHttpServer 實(shí)現(xiàn)https.

生成自簽名證書

OpenSSL官網(wǎng)下載最新版本惶楼,解壓之后拷貝demoCA到你想要放的文件夾屁魏,當(dāng)然你也可以自己生成一個demoCA滔以,在app目錄中找到CA.sh,拷貝到你的目錄氓拼,執(zhí)行

sh ./CA.sh -newca

然后創(chuàng)建一個目錄

 mkdir server

創(chuàng)建一個私鑰

openssl genrsa -out server/server-key.pem 2048

創(chuàng)建證書請求

openssl req -new -out server/server-req.csr -key server/server-key.pem

然后會需要填寫一系列信息

Country Name (2 letter code) [AU]:cn 
State or Province Name (full name) [Some-State]:fujian
Locality Name (eg, city) []:xiamen
Organization Name (eg, company) [Internet Widgits Pty Ltd]:test 
Organizational Unit Name (eg, section) []:test 
Common Name (eg, YOUR name) []:127.0.0.1   注釋:一定要寫服務(wù)器所在的ip地址 
Email Address []:sky 

Common Name 這一項必須填 localhost 或者 127.0.0.1 你画,如果填寫127.0.0.1,那么頁面中請求只能使用https://127.0.0.1:60000 而不能使用 https://localhost:60000桃漾,反之相同坏匪。

自簽署證書

openssl x509 -req -in server/server-req.csr -out server/server-cert.pem -signkey server/server-key.pem -CA demoCA/cacert.pem -CAkey demoCA/private/cakey.pem -CAcreateserial -days 3650

將證書導(dǎo)出成瀏覽器支持的.p12格式,記得導(dǎo)出密碼

openssl pkcs12 -export -clcerts -in server/server-cert.pem -inkey server/server-key.pem -out server/server.p12

自簽名證書生成完成撬统。

工程配置

將生成的p12放到工程目錄下面适滓,同時新建一個 MyHttpConnection 繼承于 HttpConnection ,重載 - (BOOL)isSecureServer 方法及 sslIdentityAndCertificates 方法

- (BOOL)isSecureServer
{

    // Create an HTTPS server (all connections will be secured via SSL/TLS)
    return YES;
}

/**
 * This method is expected to returns an array appropriate for use in kCFStreamSSLCertificates SSL Settings.
 * It should be an array of SecCertificateRefs except for the first element in the array, which is a SecIdentityRef.
 **/
- (NSArray *)sslIdentityAndCertificates
{
    SecIdentityRef identityRef = NULL;
    SecCertificateRef certificateRef = NULL;
    SecTrustRef trustRef = NULL;

    NSString *thePath = [[NSBundle mainBundle] pathForResource:@"TestCertificate" ofType:@"p12"];
    NSData *PKCS12Data = [[NSData alloc] initWithContentsOfFile:thePath];
    CFDataRef inPKCS12Data = (CFDataRef)CFBridgingRetain(PKCS12Data);
    CFStringRef password = CFSTR("123");
    const void *keys[] = { kSecImportExportPassphrase };
    const void *values[] = { password };
    CFDictionaryRef optionsDictionary = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL);
    CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);

    OSStatus securityError = errSecSuccess;
    securityError =  SecPKCS12Import(inPKCS12Data, optionsDictionary, &items);
    if (securityError == 0) {
        CFDictionaryRef myIdentityAndTrust = CFArrayGetValueAtIndex (items, 0);
        const void *tempIdentity = NULL;
        tempIdentity = CFDictionaryGetValue (myIdentityAndTrust, kSecImportItemIdentity);
        identityRef = (SecIdentityRef)tempIdentity;
        const void *tempTrust = NULL;
        tempTrust = CFDictionaryGetValue (myIdentityAndTrust, kSecImportItemTrust);
        trustRef = (SecTrustRef)tempTrust;
    } else {
        NSLog(@"Failed with error code %d",(int)securityError);
        return nil;
    }

    SecIdentityCopyCertificate(identityRef, &certificateRef);
    NSArray *result = [[NSArray alloc] initWithObjects:(id)CFBridgingRelease(identityRef),   (id)CFBridgingRelease(certificateRef), nil];

    return result;
}

- (NSObject<HTTPResponse> *)httpResponseForMethod:(NSString *)method URI:(NSString *)path
{
    // do something
    return [super httpResponseForMethod:method URI:path];
}

同時在啟動 HTTPServer(調(diào)用 startServer )之前恋追,使用 setConnectionClass 方法將 HTTPConnecdtion 替換為 MyHTTPConnection

[_httpServer setConnectionClass:[MyHTTPConnection class]];

WKWebView代理配置

WKWebView需要在WKNavagationDelegate方法中允許使用凭迹,這個方法和AFNetworking處理方法很相似罚屋,當(dāng)然你如果是用safari打開對應(yīng)的鏈接的話,就得safari允許自簽名的證書嗅绸。

  - (void)webView:(WKWebView *)webView  didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge  completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler {
      if ([challenge.protectionSpace.authenticationMethod  isEqualToString:NSURLAuthenticationMethodServerTrust]) {
          NSURLCredential *card = [[NSURLCredential alloc] initWithTrust:challenge.protectionSpace.serverTrust];
          completionHandler(NSURLSessionAuthChallengeUseCredential, card);
      }
  }

ATS設(shè)置

App Transport Security Settings添加Allow Arbitrary Loads in Web Content設(shè)置為YES

結(jié)束

附上我自己寫的小demo, 打完收工F⒚汀!鱼鸠!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末猛拴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蚀狰,更是在濱河造成了極大的恐慌愉昆,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件造锅,死亡現(xiàn)場離奇詭異撼唾,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)哥蔚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門倒谷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人糙箍,你說我怎么就攤上這事渤愁。” “怎么了深夯?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵抖格,是天一觀的道長。 經(jīng)常有香客問我咕晋,道長雹拄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任掌呜,我火速辦了婚禮滓玖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘质蕉。我一直安慰自己势篡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布模暗。 她就那樣靜靜地躺著禁悠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪兑宇。 梳的紋絲不亂的頭發(fā)上碍侦,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼祝钢。 笑死比规,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拦英。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼测秸,長吁一口氣:“原來是場噩夢啊……” “哼疤估!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起霎冯,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤铃拇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后沈撞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慷荔,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年缠俺,在試婚紗的時候發(fā)現(xiàn)自己被綠了显晶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡壹士,死狀恐怖磷雇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情躏救,我是刑警寧澤唯笙,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站盒使,受9級特大地震影響崩掘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜少办,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一苞慢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凡泣,春花似錦枉疼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贺纲,卻和暖如春航闺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工潦刃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留侮措,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓乖杠,卻偏偏與公主長得像分扎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子胧洒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345