由于蘋果是17年的1月1日期審核要求強制開啟ATS,所以各個應(yīng)用的程序員都已經(jīng)開始了https的適配忆植。下面介紹一下我司的適配。
原理:
HTTPS連接建立過程大致是继蜡,當(dāng)客戶端和服務(wù)端連接的時候爷怀,服務(wù)端返回一個證書剧辐,客戶端里存有受信任的證書機構(gòu)根證書,用這些根證書對服務(wù)端返回的證書進行驗證蜘醋,經(jīng)驗證如果證書是可信任的胁塞,就生成一個pre-master secret,用這個證書的公鑰加密后發(fā)送給服務(wù)端,服務(wù)端用私鑰解密后得到pre-master secret啸罢,再根據(jù)某種算法生成master secret编检,客戶端也同樣根據(jù)這種算法從pre-master secret生成master secret,隨后雙方的通信都用這個master secret對傳輸數(shù)據(jù)進行加密解密扰才。
開發(fā):
因為我們的應(yīng)用是使用猿題庫的網(wǎng)絡(luò)請求允懂,而猿題庫是在AFNetworking的基礎(chǔ)上封裝的,https的驗證主要就是AFSecurityPolicy模塊衩匣。
/**
驗證方式
*/
@property (readonly, nonatomic, assign) AFSSLPinningMode SSLPinningMode;
/**
客戶端的證書文件
*/
@property (nonatomic, strong, nullable) NSArray *pinnedCertificates;
/**
是否允許客戶端驗證通過一個無效的服務(wù)端證書
*/
@property (nonatomic, assign) BOOL allowInvalidCertificates;
/**
是否驗證域名有效性
*/
@property (nonatomic, assign) BOOL validatesDomainName;
/**
生成一個默認(rèn)的對象累驮,會加載本地的bundle里尋找到的cer文件
*/
+ (instancetype)defaultPolicy;
/**
該域名是否通過證書驗證
*/
- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust
forDomain:(nullable NSString *)domain;
如果你跟我一樣使用的猿題庫的框架,你只需要這樣做.
// 配置HTTPS
YTKNetworkConfig *config = [YTKNetworkConfig sharedInstance];
config.baseUrl = @"";
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"" ofType:@""];
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
config.securityPolicy.allowInvalidCertificates = YES;
config.securityPolicy.validatesDomainName = NO;
config.securityPolicy.pinnedCertificates = @[certData];
這樣就基本上結(jié)束了舵揭。
如果這時候用的有第三方的分享或者統(tǒng)計的sdk的話谤专,更換一下sdk就好了;不能添加https的需要在plist里添加說明午绳,
<key>sina.com.cn</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.0</string>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
如果服務(wù)器有用到cdn的或者oss對象存儲的置侍,在阿里云配一下證書就好了,需要上傳私鑰(這個有點兒擔(dān)心),他默認(rèn)的配置是支持http和https的,所以并不會影響老用戶拦焚。改為https下載的話蜡坊,我們可以使用證書驗證,但是我為了方便下載赎败,沒有做這一步秕衙。
在NSURLConnection的回調(diào)里,只需要這樣僵刮。
- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
//默認(rèn)驗證通過
NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
[[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
}
蘋果這么做据忘,也是為了用戶的數(shù)據(jù)安全和隱私,雖然讓很多廠商和開發(fā)者不爽搞糕,但是從長遠(yuǎn)看的話還是大勢所趨勇吊,所以大家就辛苦一下趕緊適配吧。
補充:其實客戶端適配Https沒有必須強制要證書的窍仰,直接換一下URL就可以了汉规。