筆者前不久終於發佈了本身的APP《小印記》,在此分享一些iOS源碼,若是讀者學到了有用的東西,但願能前往App Store下載《小印記》支持一下筆者,謝謝!javascript
《小印記》源碼分享--極光推送服務器篇apache
雖然今年1月1日蘋果公司並無強制要求全部APP使用HTTPS通訊,但筆者相信這也是早晚的事情。爲了通訊數據的安全,筆者花了一點時間將通訊由以前的HTTP改爲了HTTPS,這裏寫下改造過程,但願對讀者有幫助。tomcat
HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全爲目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,所以加密的詳細內容就須要SSL。安全
它是一個URI scheme(抽象標識符體系),句法類同http:體系。用於安全的HTTP數據傳輸。https: URL代表它使用了HTTP,但HTTPS存在不一樣於HTTP的默認端口及一個加密/身份驗證層(在HTTP與TCP之間)。服務器
HTTPS和HTTP的主要區別網絡
https協議須要到ca申請證書,通常免費證書不多,須要交費。session
http是超文本傳輸協議,信息是明文傳輸,https 則是具備安全性的ssl加密傳輸協議。
http和https使用的是徹底不一樣的鏈接方式,用的端口也不同,前者是80,後者是443。
http的鏈接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。
若是使用HTTP的話,通用作法是在 Info.plist 中聲明,倒退回不安全的網絡請求:
但如今既然要啓用HTTPS,因此須要將這個設置刪除!
HTTPS改造的關鍵就是證書。筆者使用的是 COMODO 的證書(在某寶上買的),反正不貴,一年也就幾十塊錢,並且還省心。購買ssl證書時,證書須要綁定域名(不能綁定IP),因此筆者又到某雲上購買了一個域名,而後將域名和服務器IP綁定起來,具體的購買和綁定方法網上搜搜有不少的。雖然網上有不少自簽證書的作法,可是否能經過審覈筆者不知,爲了安全,筆者建議仍是使用正規的SSL證書。iOS 9 中可用的受信任根證書列表
筆者使用的AFNetworking(版本3.1.0),具體源碼以下
注意:必定要將 .cer 文件導入到工程中!!!
+ (AFHTTPSessionManager *)manager; { static AFHTTPSessionManager *shareInstance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; shareInstance = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:BaseHttpURLString] sessionConfiguration:configuration]; //設置請求參數的類型:JSON shareInstance.requestSerializer = [AFJSONRequestSerializer serializer]; //設置服務器返回結果的類型:JSON (AFJSONResponseSerializer,AFHTTPResponseSerializer) shareInstance.responseSerializer = [AFJSONResponseSerializer serializer]; //設置請求的超時時間 shareInstance.requestSerializer.timeoutInterval = 20.0f; //設置ContentType shareInstance.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/html", @"text/json", @"text/plain", @"text/javascript", @"text/xml", @"image/jpeg",@"image/png", nil]; // https配置 NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"你的證書名" ofType:@"cer"]; NSData *certData = [NSData dataWithContentsOfFile:cerPath]; AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:[[NSSet alloc] initWithObjects:certData, nil]]; NSSet *dataSet = [[NSSet alloc] initWithObjects:certData, nil]; // setPinnedCertificates 設置證書文件(可能不止一個證書) [securityPolicy setPinnedCertificates:dataSet]; // allowInvalidCertificates 是否容許無效證書 [securityPolicy setAllowInvalidCertificates:NO]; // validatesDomainName 是否須要驗證域名 [securityPolicy setValidatesDomainName:YES]; shareInstance.securityPolicy = securityPolicy; }); return shareInstance; }
同時附上服務器端Tomcat(apache-tomcat-7.0.73/conf/server.xml)的配置:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLSv1.2" keystoreFile="/home/jacedy/tomcat/apache-tomcat-7.0.73/你的證書名.jks" keystorePass="123456" />
好了,到這裏,HTTPS的改造也就完成了,使用Charles抓包的話,看到的數據將會是一堆亂碼。
最後附上《小印記》截圖,但願讀者多多支持!