2016-11-20 9 views
0

私が構築している単純なiOSアプリケーション用にGoogle Translate APIを使用しようとしています。私は本質的にこの要求にSSLを使用しようとしています。iOSでSSLリクエストを実行する

Google Translate API, it supports SSLによると、だから今私の質問は私もこれを行う方法ですか?ここに私が今試みているいくつかのコードがあります。翻訳APIのAPIがあります。私はNSURLSession(代わりのNSURLConnection)を使用していますので、

func translateRequest(text: String, fromLang: String, toLang: String) { 
    let httpsURL = NSURL(string: "https://www.googleapis.com/language/translate/v2?key=<MYAPIKEYHERE>&source=\(fromLang)&target=\(toLang)&q=\(text)&format=text") 
    let sessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration() 
    sessionConfiguration.timeoutIntervalForRequest = NSTimeInterval(10) 
    let session = NSURLSession(configuration: sessionConfiguration, delegate: self, delegateQueue: nil) 
    let translateTask = session.dataTaskWithURL(httpsURL!, completionHandler: completionHandlerTranslate) 
    translateTask.resume() 
} 

func completionHandlerTranslate(dataOpt: NSData?, responseOpt: NSURLResponse?, errorOpt: NSError?) { 
    // A helper function to do something with responses 
} 

は今、私はまたNSURLSessionDelegateで私のコントローラを持っています。 Apple's docs(認証の設定のセクション)によると、NSURLSessionの場合、私はdidReceiveChallenge機能を実装する必要があります。関数のシグネチャは次のとおりです。

func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) { 

} 

しかし、私はそこにどのように入るべきか分かりません。私はサーバーなどを検証しようとしている人々の例をたくさん見てきましたが、私はまだ混乱しています。

ここに私の質問は以下のとおりです。

  1. SSLはデータを暗号化するために使用されているので、どのような私は、クライアントとサーバーの間で発生する暗号化通信のためにdidReceiveChallengeで行う必要があるのですか?
  2. didReceiveChallengeがCharlesProxyのようなプロキシを配置してデータを盗聴しようとするなど、他の証明書をすべて拒否するにはどうすればよいですか?
+0

SSL(つまりTLS 1。2)を使用すると、通信を暗号化するために何もする必要はありません。それは暗号化されています。 SSLプロキシを有効にするために管理者権限を使用しているので、チャールズだけが表示されています。しかし、誰かがそれをすることができないようにするという観点から、http://security.stackexchange.comに質問を投稿してみてください。 – Rob

答えて

0

チャールズプロキシの使用を防止することは、通常はお勧めできません。チャールズプロキシを他の誰かに使用することは現実的ではないためです。これは、ユーザーが明示的に証明書をインストールして、チャールズプロキシが生成する偽の証明書を信頼するようにOSに指示するためにのみ機能します。ユーザーは、通常、自分のデバイスで自分のデバイスで送信しているデータを確認し、そうしないようにすることができます。あなた本当にが働いてからHTTPSプロキシを防ぎたい場合はそうは言って

は、あなたがそれを行うような方法は、を固定キーです。証明書を信頼するのではなく、サーバーの信頼関係以外のすべてに対してデフォルトの処理を要求するdidReceiveChallengeハンドラーを作成します。次に、サーバーの信頼性について:

  • チャレンジオブジェクトから提案された資格情報を抽出します。
  • 資格証明の証明書チェーンから最初の(リーフ)証明書を抽出します。 IIRC、これはインデックス0にありますが、それについて私を引用しません。
  • 証明書から公開鍵を抽出します。
  • アプリのバンドルにサーバーの公開鍵のコピーをどこかに追加します。
  • 2つの公開鍵を比較します。一致した場合は、提供された証明書を使用するようにコールバックを返します。
  • 一致しない場合は、接続/タスク全体をキャンセルします。

これは基本的な考えです。この変更により、トラフィックを盗聴する唯一の方法は、アプリバンドルの公開鍵を置き換えてアプリに再署名することです。

関連する問題