自己署名証明書のリアライズとiOSのHTTPSリクエスト
HTTPS:
簡単に言えば、HTTPS SSLプロトコルはHTTPプロトコルに加えて、暗号化の層、HTTPセキュリティです。コンテンツが伝送過程で、サードパーティ製のビュー、転送コンテンツへの第三者による改ざんをタイムリーに検出されないことを保証することができますHTTP、HTTPSに比べて、より効果的にネットワークデータのセキュリティを確保するためにふりアイデンティティを防ぎます。
HTTPSクライアントとサーバとの対話:
1、クライアントの最初の要求、サーバがクライアントに公開鍵を含むデジタル証明書を返し、
2、クライアントは、その取得した対称暗号化鍵と公開鍵暗号化を生成しますサーバに戻った後、
3、サーバーは、対称暗号化鍵を取得するためにデータを暗号化して格納された受信復号化するために、自身の秘密鍵を使用して
4、および両方の対称暗号化データを介して送信されます。
IOSは、自己署名の作成httpsのステップ証明書を
注:内部でのみ使用またはテスト構成に必要な手順SSL証明書。証明書//www.2cto.com/article/201411/347512.html内部生産:あなたは、双方向の認証証明書を生成したい場合は、を参照してください。HTTP
ステップ1:秘密鍵を生成します
RSA秘密鍵を生成するために使用したOpenSSLツール
$ opensslのgenrsa -des3 -out server.keyの2048
説明:RSA秘密鍵、DES3アルゴリズム、2048強度を生成し、server.keyのは、秘密鍵のファイル名です。
注意:秘密鍵を生成し、あなたは、少なくとも4つのパスワードを提供する必要があります。
ステップ2:CSRを生成する(証明書署名要求)
秘密鍵を生成した後、あなたは、CSRファイルを作成することができます。
この時点では、2つの選択肢があります。理想的には後に、証明書は認証局(CA)に送信することができ、CAは要求者の身元を確認し、それが署名された証明書(非常に高価な)を発行します。さらに、内側のみ又は試験要件場合は、次の通り、自己署名OpenSSLを使用して実装することができます。
$ opensslのREQ -new -key server.keyの-out server.csr
説明:国、地域、都市、組織、組織単位、共通名と電子メールをオンにする必要性を入力します。一般名、またはあなた自身のドメイン名を書くことができますどこにHTTPSをサポートする場合、一般名は、それ以外の場合は、ブラウザの警告の原因となります、ドメイン名と一致する必要があります。
国名(2文字コード)[AU]:CN
都道府県名(フルネーム)[いくつかのステート]:北京
地域名(例えば、都市)[]:北京
組織名(例えば、会社)[インターネットWidgits Pty Ltdの]:joyios
組織単位名(例えば、セクション)[]:情報技術
共通名(例えば、サーバFQDNまたはあなたの名前)[]:demo.joyios.com
メールアドレス[]:[email protected]
ステップ3:秘密鍵のパスワードを削除します
必要がパスワードを指定するための最初のステップの間に、秘密鍵を作成します。そして、このコードがあること、副作用をもたらすでしょう、あなたは、Apache Webサーバーを起動するたびに、明らかに非常に不便である、パスワードを入力するように求められます。以下のように、パスワードで秘密鍵を削除するには:
CP server.keyのserver.key.org
opensslのRSA -in server.key.org -out server.keyの
ステップ4:自己署名証明書を生成します
あなたは、ヘルプCA署名、またはSSLの単なるテストの特定の実装にお金を費やすしたくない場合。さて、今あなたがの自己署名証明書を生成するために始めることができます。
一時的な自己署名証明書を使用するには、ブラウザは認証局を促すメッセージが表示されます、注意が不明です。
$ opensslのX509 -req -days 365 -in server.csr -signkey server.keyのチェックアウトをserver.crt
説明:そこ証明書の所有者情報、公開鍵の所有者、およびCRT上の情報の署名の署名。ユーザーが証明書をインストールすると、それはまた、公開鍵を持って、この証明書を、信頼を意味します。このようなサーバー認証、クライアント認証など、証明書の使用を説明する、または他の証明書に署名します。ときに、システムが署名された証明書が説明する新しい証明書を受け取ります。署名者は、実際に他の証明書によって署名され、時間通りに、証明書の缶の公開鍵署名と署名者を受け取った場合、システムが自動的に新しい証明書を信頼します。
ステップ5:秘密鍵と証明書をインストールします。
Apacheの設定ディレクトリに秘密鍵と証明書ファイルをコピーし、コピーにマック10.10システムは、/ etc / apache2の/ディレクトリができます。
ステップ6:クライアントがAF3.0は、カスタム証明書を使用して使用します
コードをコピー
1.初期化//シングルトン
AFHTTPSessionManager *マネージャ= [AFHTTPSessionManagerマネージャ]。
manager.securityPolicy.SSLPinningMode = AFSSLPinningModeCertificate。
// 2.証明書モードを設定します
NSStringの* cerPath = [[NSBundle mainBundle] pathForResource:@」XXX」ofType:@」CER」];
NSDataの* cerData = [NSDataのdataWithContentsOfFile:cerPath];
manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:[NSSet ALLOC] initWithObjects:cerData、ゼロ]。
//不正なクライアントの信頼証明書かどうか
mgr.securityPolicy.allowInvalidCertificates = YES;
//証明書でDomainフィールドにそのドメイン名を確認してください
[mgr.securityPolicy setValidatesDomainName:NO]。
コードをコピー
2.要求AFNetworking
AFSecurityPolicyクラスを設定するための最初の必要性をAFNetworking、AFSecurityPolicyクラスは、証明書の検証プロセスをカプセル化します。
コードをコピー
/ **
3つのモードでAFSecurityPolicy検証:
AFSSLPinningModeNone:ちょうど証明書信頼リストかどうかを確認します
AFSSLPinningModeCertificate:このモードの検証は、証明書信頼リストかどうか、そしてサーバ証明書を比較し、クライアント証明書は同じです
AFSSLPinningModePublicKey:唯一のサーバー証明書と同じクライアント証明書の公開鍵を検証している場合
* /
AFSecurityPolicy * SECURITYPOLICY = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
securityPolicy.allowInvalidCertificates = YES; //自己署名証明書の使用を許可するかどうか
securityPolicy.validatesDomainName = NO;ドメイン名かどうかを検証する//必要、デフォルトYES
AFHTTPSessionManager * _manager = [AFHTTPSessionManagerマネージャ]。
_manager.responseSerializer = [AFHTTPResponseSerializerシリアライザ]。
_manager.securityPolicy = SecurityPolicyの。
//セットタイムアウト
[_manager.requestSerializer willChangeValueForKey:@」timeoutinterval」];
_manager.requestSerializer.timeoutInterval = 20.f。
[_manager.requestSerializer didChangeValueForKey:@」timeoutinterval」];
_manager.requestSerializer.cachePolicy = NSURLRequestReloadIgnoringCacheData。
_manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:「アプリケーション/ XML」@「text / xmlで」@「text / plainの」、「アプリケーション/ JSON」@、ゼロ@]。
__weak typeof演算(自己)weakSelf =自己。
[_manager setSessionDidReceiveAuthenticationChallengeBlock:^ NSURLSessionAuthChallengeDisposition(NSURLSession *セッション、NSURLAuthenticationChallenge *挑戦、NSURLCredential * __ * _credentialを自動解放){
SecTrustRef serverTrust = [挑戦protectionSpace] serverTrust]。
/ **
*インポート複数のCA証明書
* /
NSStringの* cerPath = [[NSBundle mainBundle] pathForResource:@ "CA" ofType:@ "CER"]; //自己署名証明書
NSDataの* caCert = [NSDataのdataWithContentsOfFile:cerPath];
NSArrayの* cerArray = @ [caCert]。
weakSelf.manager.securityPolicy.pinnedCertificates = cerArray。
SecCertificateRef caRef = SecCertificateCreateWithData(NULL、(__bridge CFDataRef)caCert)。
NSCAssert(caRef = nilを、@」caRefがnilです」!)。
NSArray * caArray = @ [(__ブリッジID)(caRef)]。
NSCAssert(caArray = nilを、@」caArrayがnilです」!)。
OSStatusステータス= SecTrustSetAnchorCertificates(serverTrust、(__bridge CFArrayRef)caArray)。
SecTrustSetAnchorCertificatesOnly(serverTrust、NO)。
NSCAssert(errSecSuccess ==状況、@」SecTrustSetAnchorCertificatesに失敗しました」);
NSURLSessionAuthChallengeDisposition処分= NSURLSessionAuthChallengePerformDefaultHandling。
__autoreleasing NSURLCredential *資格= nilを;
IF([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]){
IF([weakSelf.manager.securityPolicy evaluateServerTrust:challenge.protectionSpace.serverTrust forDomain:challenge.protectionSpace.host]){
資格= [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]。
IF(クレデンシャル){
提供= NSURLSessionAuthChallengeUseCredential。
} そうしないと {
提供= NSURLSessionAuthChallengePerformDefaultHandling。
}
} そうしないと {
提供= NSURLSessionAuthChallengeCancelAuthenticationChallenge。
}
} そうしないと {
提供= NSURLSessionAuthChallengePerformDefaultHandling。
}
処分を返します。
}]。
コードをコピー
証明書によって提供されたコードの検証コールバックAFHTTPSessionManager再びその証明書、自身の証明書を検証し、その後、信頼された証明書に確認することで、証明書のリストに追加。