AFNetWorkingによるHTTPSリクエスト

4980 ワード

iOS 9の新しいプロパティApp Transport Securityのため、要求アドレスを一時的にすべての許可またはホワイトリストを追加するしかありません.
  • 1.デフォルトでは、任意のHTTPリクエスト
  • が許可する.
    NSAppTransportSecurity
    
      NSAllowsArbitraryLoads
      
    
    
  • 2.キー値制限
  • を追加
    NSAppTransportSecurity
    
      NSAllowsArbitraryLoads
      
      NSExceptionDomains
      
          .com
        
        
        NSIncludesSubdomains
        
        
        NSTemporaryExceptionAllowsInsecureHTTPLoads
        
        
        NSTemporaryExceptionMinimumTLSVersion
        TLSv1.1
        
      
    
    
  • 一部Keyについては、以下の表
  • を参照してください.
    Key
    コメント
    NSAllowsArbitraryLoads
    trueを設定するとすべてのHTTPリクエストがサポートされます
    NSExceptionDomains
    ホワイトリストを追加
    NSExceptionMinimumTLSVersion
    ホワイトリストドメイン名でサポートされているTLSバージョンを指定
    NSExceptionRequiresForwardSecrecy
    ホワイトリストはドメイン名がForward Secrecyをサポートするかどうかを指定します
    NSExceptionAllowsInsecureHTTPLoads
    ホワイトリスト指定ドメイン名ATS無効
    NSThirdPartyExceptionMinimumTLSVersion
    ホワイトリストサードパーティのサービスドメイン名の最低サポートTLSバージョンを指定
    NSThirdPartyExceptionRequiresForwardSecrecy
    ホワイトリストサードパーティのサービスドメイン名がForward Secrecyをサポートするかどうかを指定します.
    NSThirdPartyExceptionAllowsInsecureHTTPLoads
    ホワイトリストサードパーティドメイン名を指定してATSを無効にする
    アップルは2017年に不安全なhttpアクセスを全面的に停止すると発表したため、上記のホワイトリストを追加する方法も廃棄される.
    近い将来、httpsアクセスをサポートするためにTLSバージョンをアップグレードしなければなりません.この部分については詳しく説明しません.AFNetWorkingを使用してHTTPSリクエストを行う方法について簡単に説明します.
    一般的にappがweb serviceを使用している場合、データのセキュリティを保証するためにデータの嗅覚を防止する必要があります.通常、sslで接続してデータのパケットと嗅覚を防止すると同時に、仲介者の攻撃を防止する必要があります.攻撃者は偽造したssl証明書を通じてappを偽装した偽造サーバーに接続した.どのように解決しますか?
    まず、webサーバはssl証明書を提供する必要があります..crtファイルが必要です.その後、appが有効なssl証明書にしか接続できないサーバを設定します.
    コードの書き込みを開始する前に、.crtファイルを.cerファイルに転送し、プロジェクトをインポートします.
    インポートcerファイル
  • 方法1
  • Opensslを使用して.crt.cerファイルに変換
    openssl x509 -in XXX.crt -out XXX.cer -outform der
    
  • 方法二
  • macシステムに.crtファイルをインストールし、 に入り、インストールした.crtファイルを選択し、 -> を選択し、保存形式は.cerである.
    その後、Xcodeが開発したプロジェクトに導入するとともに、.plistファイルで以下の設定を行います.
    NSAppTransportSecurity
    
      NSAllowsArbitraryLoads
      
    
    

    AFNリクエスト
    コード部分はAFSecurityPolicy.hというクラスに使用されます.公式の説明を参照してください.AFSecurityPolicy evaluates server trust against pinned X.509 certificates and public keys over secure connections. Adding pinned SSL certificates to your app helps prevent man-in-the-middle attacks and other vulnerabilities. Applications dealing with sensitive customer data or financial information are strongly encouraged to route all communication over an HTTPS connection with SSL pinning configured and enabled.
    すなわち、セキュリティポリシー認証に使用されていることがわかる
  • 1.証明書パス
  • NSString * cerPath = [[NSBundle mainBundle] pathForResource:@"XXX" ofType:@"cer"];
    NSData * certData = [NSData dataWithContentsOfFile:cerPath];
    NSSet * certDataSet = [[NSSet alloc] initWithObjects:certData, nil];
    
  • 2.セキュリティポリシー
  • AFSecurityPolicy * securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
    securityPolicy.allowInvalidCertificates = YES;
    securityPolicy.validatesDomainName = NO;
    securityPolicy.pinnedCertificates = certDataSet;
    

    検証モードAFSSLPinningMode必要に応じて選択し、証明書を検証しない場合はAFSSLPinningModeNone、検証.cerAFSSLPinningModeCertificate
    AFSSLPinningModeNone,
    AFSSLPinningModePublicKey,
    AFSSLPinningModeCertificate,
    
    allowInvalidCertificatesは無効な証明書(自己構築証明書)を許可し、デフォルトはNOである.検証が必要な場合はYESに変更validatesDomainNameドメイン名を検証する必要があるかどうか、デフォルトはYESです.NOの場合、サーバは他の信頼できる機関から発行された証明書を使用して接続を確立することもでき、主にクライアントが要求したのはサブドメイン名であり、証明書上のは別のドメイン名である場合、ワイルドカードドメイン名を登録して検証することもできます.pinnedCertificates認証された証明書の内容
  • 3.要求
  • 要求部分は比較的簡単で、アドレスとパラメータは自分の状況によって決まる.
    AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    manager.securityPolicy = securityPolicy;
    
    NSString * url = @"https://...";
    
    [manager GET:url parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"%@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"%@",error);
    }];
    

    注意:Demoはサンプルコードを示しています.具体的な証明書と住所は実際の状況に応じて変更してください.