《小印記》iOS源碼分享--HTTPS配置篇

筆者前不久終於發佈了本身的APP《小印記》,在此分享一些iOS源碼,若是讀者學到了有用的東西,但願能前往App Store下載《小印記》支持一下筆者,謝謝!javascript

《小印記》iOS源碼分享--極光推送實踐篇html

《小印記》iOS源碼分享--自定義彈框篇java

《小印記》源碼分享--極光推送服務器篇apache

《小印記》iOS源碼分享--網絡層封裝篇json


1、前言

雖然今年1月1日蘋果公司並無強制要求全部APP使用HTTPS通訊,但筆者相信這也是早晚的事情。爲了通訊數據的安全,筆者花了一點時間將通訊由以前的HTTP改爲了HTTPS,這裏寫下改造過程,但願對讀者有幫助。tomcat


2、簡要說明

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的主要區別網絡

  1. https協議須要到ca申請證書,通常免費證書不多,須要交費。session

  2. http是超文本傳輸協議,信息是明文傳輸,https 則是具備安全性的ssl加密傳輸協議。

  3. http和https使用的是徹底不一樣的鏈接方式,用的端口也不同,前者是80,後者是443。

  4. http的鏈接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。

若是使用HTTP的話,通用作法是在 Info.plist 中聲明,倒退回不安全的網絡請求:

12.png

但如今既然要啓用HTTPS,因此須要將這個設置刪除


3、SSL證書準備

HTTPS改造的關鍵就是證書。筆者使用的是 COMODO 的證書(在某寶上買的),反正不貴,一年也就幾十塊錢,並且還省心。購買ssl證書時,證書須要綁定域名(不能綁定IP),因此筆者又到某雲上購買了一個域名,而後將域名和服務器IP綁定起來,具體的購買和綁定方法網上搜搜有不少的。雖然網上有不少自簽證書的作法,可是否能經過審覈筆者不知,爲了安全,筆者建議仍是使用正規的SSL證書。iOS 9 中可用的受信任根證書列表


4、iOS客戶端代碼配置

筆者使用的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抓包的話,看到的數據將會是一堆亂碼。


最後附上《小印記》截圖,但願讀者多多支持!  

相關文章
相關標籤/搜索