2016-11-20 5 views
0

건물중인 간단한 iOS 앱에 Google 번역 API를 사용하려고합니다. 본질적으로이 요청에 SSL을 사용하려고 노력하고 있습니다.iOS에서 SSL 요청 수행

Google Translate API, it supports SSL에 따르면. 이제 제 질문은 어떻게해야합니까? 여기 제가 지금 시도하고있는 코드가 있습니다. 번역 API의 API가 있습니다. 이제

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 
} 

내가 (대신 NSURLConnection의) NSURLSession을 사용하고 있기 때문에, 나는 또한 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 프록시를 사용하려면 관리자 권한을 사용 했으므로 Charles 만 볼 수 있습니다. 그러나 누군가가 그렇게 할 수 없다는 측면에서, http://security.stackexchange.com에 질문을 게시 해보십시오.이 문제에 더 익숙한 사람들에게 접근 할 수 있습니다 ... – Rob

답변

0

찰스 프록시는 누군가 다른 사람에게 사용하는 것이 바람직하지 않기 때문에 일반적으로 사용하지 않는 것이 좋습니다. 사용자가 명시 적으로 인증서를 설치했기 때문에 OS가 찰스 프록시가 생성 한 가짜 인증서를 신뢰하도록 알려주기 때문에 작동합니다. 사용자는 일반적으로 앱이 자신의 기기에서 보내는 데이터를 확인하고 그렇게하지 못하도록하는 기능이 좋을 것입니다. 앱이 그늘진 일을하는 것처럼 느껴지기도합니다. 당신이 정말이 작동 HTTPS 프록시를 방지하려면 그와

는 말했다, 당신이 그렇게 할 것입니다 방법은 을 고정으로합니다. 인증서를 신뢰하는 대신 서버 신뢰를 제외한 모든 것에 대한 기본 처리를 요청하는 didReceiveChallenge 처리기를 작성합니다. 그런 다음 서버 신뢰를 위해 :

  • 챌린지 개체에서 제안 된 자격 증명을 추출합니다.
  • 자격 증명의 인증서 체인에서 첫 번째 (리프) 인증서를 추출합니다. IIRC, 이것은 인덱스 0에 있지만, 그것에 관해서는 인용하지 않습니다.
  • 인증서에서 공개 키를 추출하십시오.
  • 어딘가에 앱 번들에 서버의 공개 키 사본을 추가하십시오.
  • 두 개의 공용 키를 비교하십시오. 일치하는 경우 제공된 인증서를 사용하도록 알려주는 방식으로 콜백을 반환하거나 호출합니다.
  • 일치하지 않는 경우 전체 연결/작업을 취소하십시오.

어쨌든 기본 아이디어입니다. 이 변경으로 트래픽을 탐지하는 유일한 방법은 앱 번들의 공개 키를 대체하고 앱에 다시 서명하는 것입니다.