• <ul id="cgeq2"></ul>
  • 歡迎您光臨深圳塔燈網絡科技有限公司!
    電話圖標 余先生:13699882642

    網站百科

    為您解碼網站建設的點點滴滴

    https原理和iOS的適配(認證)

    發表日期:2017-03 文章編輯:小燈 瀏覽次數:2286

    一、http和https的區別

    引用度娘的一段話

    HTTPS和HTTP的區別

    超文本傳輸協議HTTP協議被用于在Web瀏覽器和網站服務器之間傳遞信息。HTTP協議以明文方式發送內容,不提供任何方式的數據加密,如果攻擊者截取了Web瀏覽器和網站服務器之間的傳輸報文,就可以直接讀懂其中的信息,因此HTTP協議不適合傳輸一些敏感信息,比如信用卡號、密碼等。

    為了解決HTTP協議的這一缺陷,需要使用另一種協議:安全套接字層超文本傳輸協議HTTPS。為了數據傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證服務器的身份,并為瀏覽器和服務器之間的通信加密。

    HTTPS和HTTP的區別主要為以下四點:

    一、https協議需要到ca申請證書,一般免費證書很少,需要交費。

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

    三、http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。

    四、http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。(引自度娘)

    上面的那一坨總結出來就是,http數據為明文傳輸,被攔截后就直接明文可以看到數據;而https數據為加密傳輸,即使被攔截到了,那也是亂碼。當然,這里應該有抓包過https的小伙伴表示不服,這個下面會說到的。

    因為加上了這一ssl層,所以https在整個傳輸過程中,大部分時間都是消耗在了ssl的認證、加密中,所以相比于http,速度還是會慢一點的,所以上面說視頻流媒體的app可以不用強制https,因為太耗時間了。。。

    二、https之服務器簡單聊一聊

    因為本人并不是服務器開發,所以這個服務器這方面就提一下。

    要想從http升級成https,那得先服務器認證。

    就是要證明你這個服務器,是你所聲明的服務器。沒錯,就像天朝的要證明你是你自己,你證明你媽是你嗎。。。表示心疼需要證明的小伙伴。。。。

    那怎么證明你媽是你媽,呸。。。不是,是證明你的服務器,就是你所聲明的服務器那?你說你是百度,我還說我是那!!

    所以,這里就涉及到了一個權威的機構登場CA (Certificate Authority)!??!

    采用https的服務器必須從CA (Certificate Authority)申請一個用于證明服務器用途類型的證書。該證書只有用于對應的服務器的時候,客戶端才信任此主機。(一般這種證書都是要花錢的買的。。。。)

    舉個栗子

    你用瀏覽器訪問一些網站的時候,瀏覽器會自動驗證網站的證書,如果證書不是CA簽發的,那么瀏覽器會提示提示你,此網站的證書無效(因為不是指定的機構簽發的,有可能是自己簽發的),如下圖

    當不是正規機構簽發的證書

    有木有人看著眼熟,對,你登錄12306的時候,有木有!!

    堂堂大鐵路局的12306證書竟然不是正規機構簽發的??!要知道瀏覽器連草榴都信任,說明草榴的證書都是正規買的,12306竟然后還是自己簽發的。。。就差這點錢么?

    如果服務器買好了證書的話,因為要符合蘋果的ATS政策

    ·服務器所有的連接使用TLS1.2以上版本

    ·HTTPS證書必須使用SHA256以上哈希算法簽名

    ·HTTPS證書必須使用RSA 2048位或ECC 256位以上公鑰算法

    還有證書還要是符合蘋果認同的,最近沃通的證書好像就快到期了,所以是沃通簽發的趕緊去重新買。

    配置完的可以用這個來查看是否符合蘋果的要求,傳送門SSL證書 - 騰訊云

    三、https流程

    其實百度https,上面就有https的流程(我是傳送門https_百度百科),所以這里簡單的說下,其中的各種算法、參數的交換在下面的步驟就不細說了,請自行傳送門。

    這里分https的單向認證和雙向認證(單向還是雙向這個需要服務器去配置的),所以分開來說,要不小伙伴們會蒙的

    單向認證

    材料:買來的服務器證書server.cer(客戶端要放一個,用來驗證服務端),客戶端,服務器。

    數據加密基本原理:RSA加密+對稱加密(數據data經對稱密鑰key加密,然后把對稱密鑰key經RSA公鑰加密)

    1、客戶端向服務器發起請求。

    2、服務器響應到請求,同時把服務器的證書發給客戶端。

    3、客戶端接收到證書,然后和客戶端中的證書對比,如果證書不一致或者無效,那么斷開連接。如果通過,那么進行第四部。

    4、用戶產生一個隨機密鑰,然后經服務器證書中的公鑰進行加密,傳給服務端。

    5、服務端拿到加密數據和加密密鑰,用服務器的私鑰解開密鑰,得到對稱密鑰key。

    6、服務端和客戶端互相通訊指定這個密鑰為加密密鑰。握手結束

    7、客戶端和服務端開始通訊,通訊數據由對稱密鑰加密。

    簡易圖(對付看吧)

    雙向認證

    雙向認證比單向認證多了一步,就是服務器要認證客戶端,按照百度百科上的步驟,客戶端應該有一個由CA(或正規機構)簽發的p12證書,和CA根證書(簽名的p12就是由這個簽名的)

    //上面的CA根證書和p12證書 ? 其實都可以自簽的,下面介紹的也是自簽的

    材料:買來的服務器證書server.cer(客戶端要放一個,用來驗證服務端),客戶端,服務器端,CA的根證書(放到服務器中,用來驗證客戶端的證書),p12證書(用來放到客戶端,網絡請求的時候會傳給服務端)。

    步驟:就是在上面第4步的時候,要用p12文件來對一段數據進行簽名,然后把簽名和p12證書,加密的對稱密鑰(上面的說過的)傳給服務器,然后服務器接到以后,會用CA根證書(或自簽的根證書)來對證書和簽名數據進行驗證,如果正確,通訊繼續,否則,斷開連接。

    其他的都是一樣的。

    四、自簽證書的過程

    p12和CA根證書,其實也可以自簽的,現在說下自簽的過程。

    首先,先有個工具,xca

    xca

    就是這個東西,然后安裝以后

    xca界面

    首先,先生生成一個datacode

    新建database

    填寫database名字和存放地址

    設置database的密碼,并確認

    然后就會生成一個這個東西

    然后根據這個database生成一個CA根證書(當然,是自簽的了)

    根證書ca設置

    根證書的具體設置

    根證書CA私鑰的設置

    直接點確定,然后就會提示你privatekey創建好了,然后直接確定到下面這個圖

    根證書創建成功后會在xca中顯示出來的

    然后導出CA根證書

    根證書CA的導出

    就是它

    這時候,自簽的CA根證書就創建好了,這個CA證書是要放到服務器上的。一般默認的CA證書時間是10年。

    然后這時候,就要創建自簽的p12證書了。選中這個CA證書,然后

    創建p12證書

    設置p12證書的源頭

    然后subject里面和設置CA證書一樣。

    p12證書默認是一年的,如果感覺短的話 ? 可以在Extensions中設置時間。

    然后把P12證書放到客戶端項目里。

    五、iOS端的https雙向適配

    AFN的https的雙向適配2.x和3.0不一樣,先說3.0

    客戶端認證服務端,

    shareManager = [AFHTTPSessionManager manager];

    shareManager.securityPolicy = [self customSecurityPolicyWithCerName:HPWalletServerCerName];//調用方法

    //客戶端認證服務端的方法

    + (AFSecurityPolicy *)customSecurityPolicyWithCerName:(NSString *)cerName{

    //導入證書路徑

    NSString *cerPath = [[NSBundle mainBundle] pathForResource:cerName ofType:@""];

    //加載證書

    NSData *cerData = [NSData dataWithContentsOfFile:cerPath];

    NSSet *certSet = [NSSet setWithObject:cerData];

    //使用AFSSLPinningModeCertificate證書驗證模式

    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:certSet];

    //allowInvalidCertificates 是否允許無效證書(也就是自建的證書),默認為NO

    //如果是需要驗證自建證書,需要設置為YES

    securityPolicy.allowInvalidCertificates = NO;

    //是否需要驗證域名,默認為YES

    //假如證書的域名與你請求的域名不一致,需把該項設置為NO;如設成NO的話,即服務器使用其他可信任機構頒發的證書,也可以建立連接,這個非常危險,建議打開。

    //置為NO,主要用于這種情況:客戶端請求的是子域名,而證書上的是另外一個域名。因為SSL證書上的域名是獨立的,假如證書上注冊的域名是www.google.com,那么mail.google.com是無法驗證通過的;當然,有錢可以注冊通配符的域名*.google.com,但這個還是比較貴的。

    //如置為NO,建議自己添加對應域名的校驗邏輯。

    securityPolicy.validatesDomainName = YES;

    return securityPolicy;

    }

    重寫AFN的方法 ?來讓服務器認證客戶端

    {//新的https

    shareManager.securityPolicy = [self customSecurityPolicyWithCerName:HPWalletServerCerName];

    //客戶端請求驗證,重寫setSessionDidReceiveAuthenticationChallengeBlock方法

    [shareManager setSessionDidReceiveAuthenticationChallengeBlock:^NSURLSessionAuthChallengeDisposition(NSURLSession *session, NSURLAuthenticationChallenge *challenge, NSURLCredential *__autoreleasing *_credential) {

    NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling;

    __autoreleasing NSURLCredential *credential = nil;

    if([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {

    if([shareManager.securityPolicy evaluateServerTrust:challenge.protectionSpace.serverTrust forDomain:challenge.protectionSpace.host]) {

    credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];

    if(credential) {

    disposition =NSURLSessionAuthChallengeUseCredential;

    } else {

    disposition =NSURLSessionAuthChallengePerformDefaultHandling;

    }

    } else {

    disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge;

    }

    } else {

    // client authentication

    SecIdentityRef identity = NULL;

    SecTrustRef trust = NULL;

    NSString *p12 = [[NSBundle mainBundle] pathForResource:@"p12文件的名字" ofType:@"p12"];

    NSFileManager *fileManager =[NSFileManager defaultManager];

    if(![fileManager fileExistsAtPath:p12]) {

    NSLog(@"hpwallet-client.p12:not exist");

    } else {

    NSData *PKCS12Data = [NSData dataWithContentsOfFile:p12];

    if ([[self class] extractIdentity:&identity andTrust:&trust fromPKCS12Data:PKCS12Data]) {

    SecCertificateRef certificate = NULL;

    SecIdentityCopyCertificate(identity, &certificate);

    const void *certs[] = {certificate};

    CFArrayRef certArray =CFArrayCreate(kCFAllocatorDefault, certs,1,NULL);

    credential =[NSURLCredential credentialWithIdentity:identity certificates:(__bridge ?NSArray*)certArray persistence:NSURLCredentialPersistencePermanent];

    disposition =NSURLSessionAuthChallengeUseCredential;

    }

    }

    }

    *_credential = credential;

    return disposition;

    }];

    }

    + (BOOL)extractIdentity:(SecIdentityRef *)outIdentity andTrust:(SecTrustRef *)outTrust fromPKCS12Data:(NSData *)inPKCS12Data {

    OSStatus securityError = errSecSuccess;

    //client certificate password

    NSDictionary*optionsDictionary = [NSDictionary dictionaryWithObject:@“p12的密碼“ forKey:(__bridge id)kSecImportExportPassphrase];

    CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);

    securityError = SecPKCS12Import((__bridge CFDataRef)inPKCS12Data,(__bridge CFDictionaryRef)optionsDictionary,&items);

    if(securityError == 0) {

    CFDictionaryRef myIdentityAndTrust =CFArrayGetValueAtIndex(items,0);

    const void*tempIdentity =NULL;

    tempIdentity= CFDictionaryGetValue (myIdentityAndTrust,kSecImportItemIdentity);

    *outIdentity = (SecIdentityRef)tempIdentity;

    const void*tempTrust =NULL;

    tempTrust = CFDictionaryGetValue(myIdentityAndTrust,kSecImportItemTrust);

    *outTrust = (SecTrustRef)tempTrust;

    } else {

    NSLog(@"Failedwith error code %d",(int)securityError);

    return NO;

    }

    return YES;

    }

    AFN2.x適配

    客戶端認證服務器

    manage.securityPolicy = [HttpServiceAFNetworkImp customSecurityPolicy];

    + (AFSecurityPolicy *)customSecurityPolicy

    {

    NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"服務器.cer證書的名字"ofType:@"der"];

    NSData *cerData = [NSData dataWithContentsOfFile:cerPath];

    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];

    //allowInvalidCertificates 是否允許無效證書(也就是自建的證書),默認為NO

    //如果是需要驗證自建證書,需要設置為YES

    securityPolicy.allowInvalidCertificates = NO;

    //是否需要驗證域名,默認為YES

    //假如證書的域名與你請求的域名不一致,需把該項設置為NO;如設成NO的話,即服務器使用其他可信任機構頒發的證書,也可以建立連接,這個非常危險,建議打開。

    //置為NO,主要用于這種情況:客戶端請求的是子域名,而證書上的是另外一個域名。因為SSL證書上的域名是獨立的,假如證書上注冊的域名是www.google.com,那么mail.google.com是無法驗證通過的;當然,有錢可以注冊通配符的域名*.google.com,但這個還是比較貴的。

    //如置為NO,建議自己添加對應域名的校驗邏輯。

    securityPolicy.validatesDomainName = YES;

    //放入證書

    securityPolicy.pinnedCertificates = @[cerData];

    return securityPolicy;

    }

    服務器認證客戶端,這個要把AFN的AFURLConnectionOperation.m文件中 ?- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge方法替換掉 ?替換成

    - (void)connection:(NSURLConnection *)connection

    willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge

    {

    NSString *thePath = [[NSBundle mainBundle] pathForResource:@"client" ofType:@"p12"];

    //倒入證書 ? ? ? NSLog(@"thePath===========%@",thePath);

    NSData *PKCS12Data = [[NSData alloc] initWithContentsOfFile:thePath];

    CFDataRef inPKCS12Data = (__bridge CFDataRef)PKCS12Data;

    SecIdentityRef identity = NULL;

    // extract the ideneity from the certificate

    [self extractIdentity :inPKCS12Data toIdentity:&identity];

    SecCertificateRef certificate = NULL;

    SecIdentityCopyCertificate (identity, &certificate);

    const void *certs[] = {certificate};

    // ? ? ? ? ? ? ? ? ? ? ? ?CFArrayRef certArray = CFArrayCreate(kCFAllocatorDefault, certs, 1, NULL);

    // create a credential from the certificate and ideneity, then reply to the challenge with the credential

    //NSLog(@"identity=========%@",identity);

    NSURLCredential *credential = [NSURLCredential credentialWithIdentity:identity certificates:nil persistence:NSURLCredentialPersistencePermanent];

    // ? ? ? ? ? credential = [NSURLCredential credentialWithIdentity:identity certificates:(__bridge NSArray*)certArray persistence:NSURLCredentialPersistencePermanent];

    [challenge.sender useCredential:credential forAuthenticationChallenge:challenge];

    }

    并添加下面的方法

    - (OSStatus)extractIdentity:(CFDataRef)inP12Data toIdentity:(SecIdentityRef*)identity {

    OSStatus securityError = errSecSuccess;

    CFStringRef password = CFSTR("證書密碼");

    const void *keys[] = { kSecImportExportPassphrase };

    const void *values[] = { password };

    CFDictionaryRef options = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL);

    CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);

    securityError = SecPKCS12Import(inP12Data, options, &items);

    if (securityError == 0)

    {

    CFDictionaryRef ident = CFArrayGetValueAtIndex(items,0);

    const void *tempIdentity = NULL;

    tempIdentity = CFDictionaryGetValue(ident, kSecImportItemIdentity);

    *identity = (SecIdentityRef)tempIdentity;

    }

    if (options) {

    CFRelease(options);

    }

    return securityError;

    }


    本頁內容由塔燈網絡科技有限公司通過網絡收集編輯所得,所有資料僅供用戶學習參考,本站不擁有所有權,如您認為本網頁中由涉嫌抄襲的內容,請及時與我們聯系,并提供相關證據,工作人員會在5工作日內聯系您,一經查實,本站立刻刪除侵權內容。本文鏈接:http://www.juherenli.com/20389.html
    相關開發語言
     八年  行業經驗

    多一份參考,總有益處

    聯系深圳網站公司塔燈網絡,免費獲得網站建設方案及報價

    咨詢相關問題或預約面談,可以通過以下方式與我們聯系

    業務熱線:余經理:13699882642

    Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.    

    • QQ咨詢
    • 在線咨詢
    • 官方微信
    • 聯系電話
      座機0755-29185426
      手機13699882642
    • 預約上門
    • 返回頂部
    国产网站麻豆精品视频| 6一12呦女精品| 99精品在线观看视频| aaa级精品久久久国产片| 国产精品亚洲综合五月天| 国产精品涩涩涩视频网站| 亚洲国产小视频精品久久久三级 | 亚洲精品无码久久久久去q | 亚洲精品又粗又大又爽A片| 亚洲综合精品香蕉久久网97| 热久久这里是精品6免费观看 | 精品国产美女福利到在线不卡| 日韩在线精品一二三区| 好叼操这里只有精品| 精品熟人妻一区二区三区四区不卡| 久久老子午夜精品无码怎么打| 大伊香蕉精品一区视频在线 | 亚洲国产精品不卡在线电影| 久久精品国产色蜜蜜麻豆| 国产九九久久99精品影院| 精品国产一区二区三区AV| 91精品免费久久久久久久久| 亚洲国产综合精品中文第一区| 国产精品一区二区av| 国产成人麻豆亚洲综合无码精品 | 奇米影视7777久久精品人人爽| 少妇人妻偷人精品无码视频 | 五月花精品视频在线观看| 亚洲综合精品香蕉久久网| 成人区精品一区二区不卡| 精品国产综合区久久久久久 | 日本精品不卡视频| 国产精品兄妹在线观看麻豆| 国产在线观看一区二区三区精品| 久久精品国产亚洲Aⅴ香蕉| 精品国产免费一区二区三区| 国产精品久久久99| 久久精品国产亚洲一区二区三区| 亚洲精品无码99在线观看 | 亚洲精品精华液一区二区| 亚洲精品国产av成拍色拍|