去年公司開始做https適配,在網(wǎng)上找的afn支持https的代碼,直接復(fù)制進(jìn)代碼挺好用的御毅,但是今年證書要過期了,正好我們的APP又遇到了2.1大禮包事件平斩,遲遲不給我們上線亚享,而且我們發(fā)現(xiàn)要想使用新證書我們必須修改我們本地的代碼,各種坑啊绘面。不說了,直接上原來的代碼
-(AFSecurityPolicy*)customSecurityPolicy {
? ? NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"server" ofType:@"cer"];
? ? NSData *cerData = [NSData dataWithContentsOfFile:cerPath];
? ? AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
? ? securityPolicy.allowInvalidCertificates = YES;
? ? securityPolicy.validatesDomainName=NO;
? ? securityPolicy.pinnedCertificates= [NSSetsetWithArray:@[cerData]];
? ? returnsecurityPolicy;
}
就這么幾行代碼就可以實(shí)現(xiàn)使用AFNetworking來支持HTTPS,但是潛在的問題也很嚴(yán)重揭璃。
注意就是這行個(gè)代碼坑壞我們了AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
AFSecurityPolicy相關(guān)的配置
1> SSLPinningMode
SSLPinningMode 定義了https連接時(shí)晚凿,如何去校驗(yàn)服務(wù)器端給予的證書。
typedefNS_ENUM(NSUInteger, AFSSLPinningMode) {? ? AFSSLPinningModeNone,? ? AFSSLPinningModePublicKey,? ? AFSSLPinningModeCertificate,};
AFSSLPinningModeNone: 代表客戶端無條件地信任服務(wù)器端返回的證書瘦馍。
AFSSLPinningModePublicKey: 代表客戶端會(huì)將服務(wù)器端返回的證書與本地保存的證書中歼秽,PublicKey的部分進(jìn)行校驗(yàn);如果正確情组,才繼續(xù)進(jìn)行燥筷。
AFSSLPinningModeCertificate: 代表客戶端會(huì)將服務(wù)器端返回的證書和本地保存的證書中的所有內(nèi)容,包括PublicKey和證書部分院崇,全部進(jìn)行校驗(yàn)肆氓;如果正確,才繼續(xù)進(jìn)行底瓣。
如果選了AFSSLPinningModeCertificate,那么服務(wù)器的證書過期了,導(dǎo)入你本地的證書也不能用了闭专,當(dāng)時(shí)只復(fù)制了人家的代碼鸽捻,沒有好好看一下每行代碼是干什么用的,這是很不好的習(xí)慣白鲁Α;济瘛!?寻稹Fゲ!
所以說如果你的APP對安全性的要求特別高奶赔,可以用AFSSLPinningModeCertificate惋嚎,但是記得及時(shí)看看證書有沒有過期,提前更新APP替換了證書就OK站刑,就怕遇到蘋果延遲審核的情況另伍,到時(shí)候就麻煩了。我還是建議使用AFSSLPinningModePublicKey绞旅,這個(gè)只驗(yàn)證公鑰部分就可以了摆尝,你導(dǎo)入本地的證書過期了也沒關(guān)系,服務(wù)器的證書的公鑰是不會(huì)變的因悲。