為您解碼網(wǎng)站建設(shè)的點點滴滴
發(fā)表日期:2016-12 文章編輯:小燈 瀏覽次數(shù):2607
由于蘋果規(guī)定2017年1月1日以后,所有APP都要使用HTTPS進行網(wǎng)絡(luò)請求,否則無法上架,因此研究了一下在iOS中使用HTTPS請求的實現(xiàn)。網(wǎng)上搜索了一些比較有用資料,大家可以參考下
蘋果強制升級的HTTPS不僅僅是在接口HTTP上加個S那么簡單:
它所有滿足的是iOS9中新增App Transport Security(簡稱ATS)特性:
那滿足ATS我們需要做什么呢
1.必須是蘋果信任的CA證書機構(gòu)頒發(fā)的證書
2.后臺傳輸協(xié)議必須滿足: TLS1.2 (這很重要, 后面的自制證書滿足這個條件是前提)
3.簽字算法只能是下面的一種:
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
4.證書必須使用SHA256或者更好的哈希算法進行簽名,要么是2048位或者更長的RSA密鑰,要么就是256位或更長的ECC密鑰。
目前有兩種升級到HTTPS得方法:
1.第三方認證的頒發(fā)CA證書(推薦)
2.自己制作證書(這種不知道能不能滿足蘋果的審核)
一: 第三方認證的頒發(fā)CA證書
證書到底長什么樣子呢? 取個栗子:
大家請打開https://www.baidu.com
然后看到
那些證書機構(gòu)頒發(fā)的證書能用:蘋果官方信任證書
收費SSL證書: 網(wǎng)上百度一大把, 收費還挺貴的,自己可以多找?guī)讉€對比一下
免費SSL證書: 除了收費的CA證書機構(gòu), 你還可以去騰訊云申請免費的SSL證書, 教程免費在騰訊云申請SSL證書的方法
沃通(WoSign)免費的SSL證書最近被蘋果封殺了, 能不能用大家可以看一下蘋果的公告: 您的蘋果手機輕點“設(shè)置”>“通用”>“關(guān)于本機”>”證書信任設(shè)置”>”進一步了解被信任的證書”去了解
檢測你的接口是否滿足蘋果的ATS要求, 有以下兩種方法:
1.騰訊云提供的檢測頁面檢測
2 終端輸入 nsurl --ats-diagnostics --verbose 你的接口地址
大家可以參考這篇文章,里面的說的很明白:
關(guān)于iOS9中的App Transport Security相關(guān)說明及適配(更新于2016.7.1)
里面會詳細說明你的證書哪點不符合ATS要求
當然下面自己制作證書去實現(xiàn)HTTPS的,檢測不通過的,所以我覺得審核會被拒
這種方法配置好了, 在手機端就什么都不用配置就可以請求了
二: 自己制作證書
蘋果官方信任證書里說到有三種證書:
1 可信的根證書用于建立信任鏈,以驗證由可信的根簽署的其他證書,例如,與 Web 服務(wù)器建立安全連接。當 IT 管理員創(chuàng)建 iPhone、iPad 或 iPod touch 的配置描述文件時,無需提供這些可信的根證書。
2 始終詢問的證書不受信任,但不受阻止。使用其中一個證書時,系統(tǒng)將提示您選擇是否信任該證書。
3 已阻止的證書視為被盜用,將不再受信任。
自制證書我覺得應(yīng)該就是屬于第二種情況, 所以這種方法我也不知道能不能通過蘋果的審核, 只是提供一個方法給大家參考, 看到網(wǎng)上有人說可以,有人說不可以, 不到1月1號,自己沒試過都不敢說大話
這種方式拿到后臺的接口用谷歌瀏覽器打開跟百度的證書是有區(qū)別的
很明顯沒有綠鎖, 當打開的時候會詢問是否連接這個不受信任的連接才會進一步打開, 下面就來一步步的實現(xiàn)(包括怎么制作證書)
iOS使用自簽名證書實現(xiàn)HTTPS請求
iOS Https協(xié)議 自簽證書訪問數(shù)據(jù)
參考這個例子的時候,博主自帶的Demo AFN框架請求不了數(shù)據(jù), 我用了最新AFN版本的成功返回數(shù)據(jù)
還可以參考一下
iOS 10 適配 ATS app支持https通過App Store審核
我在利用原生的代碼測試時遇到的問題
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
NSURLSessionDataTask *task =? [session dataTaskWithURL:[NSURL URLWithString:@"https://www.baidu.com"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}];
[task resume];
}
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler {
NSLog(@"接收到服務(wù)器響應(yīng)");
//注意:這里需要使用completionHandler回調(diào)告訴系統(tǒng)應(yīng)該如何處理服務(wù)器返回的數(shù)據(jù)
//默認是取消
/**
NSURLSessionResponseCancel = 0,? ? ? ? ? ? 默認的處理方式,取消
NSURLSessionResponseAllow = 1,? ? ? ? ? ?接收服務(wù)器返回的數(shù)據(jù)
NSURLSessionResponseBecomeDownload = 2,? ? 變成一個下載請求
NSURLSessionResponseBecomeStream? ? ? ? ?變成一個流
*/
completionHandler(NSURLSessionResponseAllow);
}
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveData:(NSData *)data {
NSLog(@"獲取到服務(wù)段數(shù)據(jù)");
NSLog(@"%@",[self jsonToDictionary:data]);
}
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didCompleteWithError:(nullable NSError *)error {
NSLog(@"請求完成%@", error);
}
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler {
NSLog(@"證書認證");
if ([[[challenge protectionSpace] authenticationMethod] isEqualToString: NSURLAuthenticationMethodServerTrust]) {
do
{
SecTrustRef serverTrust = [[challenge protectionSpace] serverTrust];
NSCAssert(serverTrust != nil, @"serverTrust is nil");
if(nil == serverTrust)
break; /* failed */
/**
*? 導(dǎo)入多張CA證書(Certification Authority,支持SSL證書以及自簽名的CA),請?zhí)鎿Q掉你的證書名稱
*/
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"ca" ofType:@"cer"];//自簽名證書
NSData* caCert = [NSData dataWithContentsOfFile:cerPath];
NSCAssert(caCert != nil, @"caCert is nil");
if(nil == caCert)
break; /* failed */
SecCertificateRef caRef = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)caCert);
NSCAssert(caRef != nil, @"caRef is nil");
if(nil == caRef)
break; /* failed */
//可以添加多張證書
NSArray *caArray = @[(__bridge id)(caRef)];
NSCAssert(caArray != nil, @"caArray is nil");
if(nil == caArray)
break; /* failed */
//將讀取的證書設(shè)置為服務(wù)端幀數(shù)的根證書
OSStatus status = SecTrustSetAnchorCertificates(serverTrust, (__bridge CFArrayRef)caArray);
NSCAssert(errSecSuccess == status, @"SecTrustSetAnchorCertificates failed");
if(!(errSecSuccess == status))
break; /* failed */
SecTrustResultType result = -1;
//通過本地導(dǎo)入的證書來驗證服務(wù)器的證書是否可信
status = SecTrustEvaluate(serverTrust, &result);
if(!(errSecSuccess == status))
break; /* failed */
NSLog(@"stutas:%d",(int)status);
NSLog(@"Result: %d", result);
BOOL allowConnect = (result == kSecTrustResultUnspecified) || (result == kSecTrustResultProceed);
if (allowConnect) {
NSLog(@"success");
}else {
NSLog(@"error");
}
/* kSecTrustResultUnspecified and kSecTrustResultProceed are success */
if(! allowConnect)
{
break; /* failed */
}
#if 0
/* Treat kSecTrustResultConfirm and kSecTrustResultRecoverableTrustFailure as success */
/*?since the user will likely tap-through to see the dancing bunnies */
if(result == kSecTrustResultDeny || result == kSecTrustResultFatalTrustFailure || result == kSecTrustResultOtherError)
break; /* failed to trust cert (good in this case) */
#endif
// The only good exit point
NSLog(@"信任該證書");
NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
completionHandler(NSURLSessionAuthChallengeUseCredential,credential);
return [[challenge sender] useCredential: credential
forAuthenticationChallenge: challenge];
}
while(0);
}
// Bad dog
NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge,credential);
return [[challenge sender] cancelAuthenticationChallenge: challenge];
}
- (NSDictionary *)jsonToDictionary:(NSData *)jsonData {
NSError *jsonError;
NSDictionary *resultDic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves error:&jsonError];
return resultDic;
}
@end
下面說說我在配置自己制作證書過程中遇到的問題:
1.轉(zhuǎn)換證書: 把后臺給你的.crt證書轉(zhuǎn)化為.cer后綴
終端命令行openssl x509 -in 你的證書.crt -out 你的證書.cer -outform der
2.利用系統(tǒng)的方法來不到- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler { NSLog(@"證書認證"); }這個方法的時候, 是因為后臺的傳輸協(xié)議還沒升級到TLS1.2, 叫后臺升級后就可以來到驗證證書的這個方法了.
3.拖入證書讀取不出證書數(shù)據(jù)
參考: https的證書錯誤,錯誤碼-1012問題及解決方案
SDWebImage: 項目中大家用到AFN請求網(wǎng)絡(luò)數(shù)據(jù), 升級驗證SSL證書的方案相信你看完上面的參考文章已經(jīng)沒問題了, 我給出的代碼, 自定義網(wǎng)絡(luò)請求也沒問題了, 還有就是SDWebImage框架的請求HTTPS的圖片時,大家可以繞過證書驗證去加載圖片[imageView sd_setImageWithURL:[NSURL URLWithString:urlString] placeholderImage:self.placeholder options:SDWebImageAllowInvalidSSLCertificates];
恩, 這就是這幾天升級HTTPS覺得有幫助的參考和總結(jié).希望幫到你
日期:2018-04 瀏覽次數(shù):6774
日期:2017-02 瀏覽次數(shù):3448
日期:2017-09 瀏覽次數(shù):3674
日期:2017-12 瀏覽次數(shù):3542
日期:2018-12 瀏覽次數(shù):4839
日期:2016-12 瀏覽次數(shù):4592
日期:2017-07 瀏覽次數(shù):13658
日期:2017-12 瀏覽次數(shù):3522
日期:2018-06 瀏覽次數(shù):4278
日期:2018-05 瀏覽次數(shù):4454
日期:2017-12 瀏覽次數(shù):3568
日期:2017-06 瀏覽次數(shù):3993
日期:2018-01 瀏覽次數(shù):3957
日期:2016-12 瀏覽次數(shù):3922
日期:2018-08 瀏覽次數(shù):4439
日期:2017-12 瀏覽次數(shù):3726
日期:2016-09 瀏覽次數(shù):6443
日期:2018-07 瀏覽次數(shù):3220
日期:2016-12 瀏覽次數(shù):3240
日期:2018-10 瀏覽次數(shù):3392
日期:2018-10 瀏覽次數(shù):3501
日期:2018-09 瀏覽次數(shù):3591
日期:2018-02 瀏覽次數(shù):3609
日期:2015-05 瀏覽次數(shù):3536
日期:2018-09 瀏覽次數(shù):3316
日期:2018-06 瀏覽次數(shù):3444
日期:2017-02 瀏覽次數(shù):3882
日期:2018-02 瀏覽次數(shù):4346
日期:2018-02 瀏覽次數(shù):4190
日期:2016-12 瀏覽次數(shù):3586
Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.