2016-03-31 11 views
17

Tôi nhận được lỗi sau với tự ký giấy chứng nhậniOS 9,3: Một lỗi SSL đã xảy ra và một kết nối an toàn với máy chủ không thể thực hiện

Lỗi miền = NSURLErrorDomain Mã = -1200 "Một lỗi SSL đã xảy ra và một kết nối an toàn với máy chủ không thể được thực hiện.

trong khi thử nghiệm dịch vụ web cho một trong những ứng dụng demo của tôi với

Lưu ý:trước khi giả định trùng lặp của nó, tôi sẽ yêu cầu xin vui lòng đọc nó tất cả các cách, thậm chí cùng tôi đã thông báo cho các diễn đàn apple dev

Sử dụng Alamofire Thư viện


func testAlamofireGETRequest() -> Void 
    { 
     Alamofire.request(.GET, "https://filename.hostname.net/HelloWeb/service/greeting/john") 
      .responseJSON 
     { response in 
      print("Response JSON: \(response.result.value)") 
     } 
} 

Sử dụng NSURLSession


func testNSURLSessionRequest() -> Void { 

     let session = NSURLSession.sharedSession() 
     let urlString = "https://filename.hostname.net/HelloWeb/service/greeting/john" 
     let url = NSURL(string: urlString) 
     let request = NSURLRequest(URL: url!) 
     let dataTask = session.dataTaskWithRequest(request) { (data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in 
      print("done, error: \(error)") 

      //Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made. 
     } 
     dataTask.resume() 
    } 

Tôi đã dành 2 ngày không có may mắn :(

có loạt các câu hỏi đã được đăng nhưng không làm việc cho tôi

posted Alamofire git vấn đề


My Info.pist sơ được cập nhật cho các thiết lập ATS cách này

<key>NSAppTransportSecurity</key> 
    <dict> 
     <key>NSExceptionDomains</key> 
     <dict> 
      <key>filename.hostname.net</key> 
      <dict> 
       <key>NSExceptionRequiresForwardSecrecy</key> 
       <false/> 
       <key>NSExceptionAllowsInsecureHTTPLoads</key> 
       <true/> 
       <key>NSIncludesSubdomains</key> 
       <true/> 
       <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> 
       <true/> 
      </dict> 
     </dict> 
    </dict> 

khi đó tôi có thể nhận được phản hồi cho

http: //filename.hostname.net

https: //google.com

nhưng không dành cho https: //filename.hostname.net

Có ai vui lòng cho tôi biết lý do tại sao tôi không thể làm việc này sau những nỗ lực to lớn không?

+0

Làm thế nào để bắt đầu với việc xem xét bắt tay SSL? Bạn có thể sử dụng Wireshark? – Greycon

+0

RDC, Nó làm việc cho tôi: Câu trả lời cho tôi nhận là: 'THÀNH CÔNG:

Thiếu khóa Auth!

'hoàn hảo, tôi không cung cấp tiêu đề cho máy chủ của mình. Nó đang làm việc về phía tôi. kiểm tra gist: https://gist.github.com/tush4r/142ba2a45bc9ed538dbe393be7ce36e2 – Fennec

Trả lời

4

Tôi đoán máy chủ bạn đang cố gắng kết nối có chứng chỉ không hợp lệ hoặc không khớp với tiêu chuẩn iOS 9 cho ECC, Mật mã, v.v.

  • Nếu bạn đang sử dụng API NSURLSession mạng cấp cao, NSURLConnection, hoặc bất cứ điều gì lớp trên đầu trang của những người-bạn không có quyền kiểm soát trực tiếp qua dãy cypher được cung cấp bởi khách hàng. Các API này chọn một bộ các bộ mã cypher sử dụng logic nội bộ của chúng.

  • Nếu bạn đang sử dụng API mạng cấp thấp — CFSocketStream, thông qua API NSStream và CFStream và bất kỳ thứ gì thấp hơn - bạn có thể chọn một cách rõ ràng bộ nhóm cypher bạn muốn sử dụng. Cách bạn thực hiện điều này phụ thuộc vào API cụ thể.

Các tiêu chuẩn thực hiện là:

  1. tạo cặp dòng

  2. cấu hình nó cho TLS

  3. lấy bối cảnh tải an toàn bằng cách sử dụng tài sản

  4. kCFStreamPropertySSLContext

    configu tái thuộc tính cụ thể trong bối cảnh đó

  5. mở suối

Bạn có thể thấy một ví dụ về điều này trong đoạn code mẫu TLSTool. Cụ thể, hãy xem lớp TLSToolServer, nơi bạn có thể thấy chính xác chuỗi này.

Trong một bối cảnh rất ngắn, bạn muốn cấu hình luồng theo một cách như vậy mà nó bỏ qua sự an toàn, tuy nhiên, trong trường hợp của Alamofire bạn có thể làm điều này trực tiếp theo:

func bypassAuthentication() { 
     let manager = Alamofire.Manager.sharedInstance 
     manager.delegate.sessionDidReceiveChallenge = { session, challenge in 
      var disposition: NSURLSessionAuthChallengeDisposition = .PerformDefaultHandling 
      var credential: NSURLCredential? 
      if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { 
       disposition = NSURLSessionAuthChallengeDisposition.UseCredential 
       credential = NSURLCredential(forTrust: challenge.protectionSpace.serverTrust!) 
      } else { 
       if challenge.previousFailureCount > 0 { 
        disposition = .CancelAuthenticationChallenge 
       } else { 
        credential = manager.session.configuration.URLCredentialStorage?.defaultCredentialForProtectionSpace(challenge.protectionSpace) 
        if credential != nil { 
         disposition = .UseCredential 
        } 
       } 
      } 
      return (disposition, credential) 
     } 
    } 

cho tôi biết nếu điều đó có ích. Cảm ơn bạn!

+0

Nếu điều này không, hãy cho tôi biết - Tôi sẽ giúp bạn định cấu hình luồng đúng cách bằng cách vô hiệu hóa các bộ sản phẩm cypher ECDHE TLS. – Fennec

+0

Thật không may điều này đã không giúp tôi: (Tôi đã cập nhật các bài viết câu hỏi là tốt. – swiftBoy

8

Apple đã phát hành danh sách yêu cầu đầy đủ cho Bảo mật truyền tải ứng dụng.

Đã tắt rằng chúng tôi đã làm việc với TLS v1.2 nhưng thiếu một số yêu cầu khác.

Here's the full check list:

  • TLS đòi hỏi ít nhất phiên bản 1.2.
  • Mật mã kết nối được giới hạn đối với mật khẩu chuyển tiếp (xem bên dưới để biết danh sách mật mã.)
  • Dịch vụ này yêu cầu chứng chỉ sử dụng ít nhất một dấu vân tay SHA256 với khóa RSA 2048 bit trở lên hoặc 256 bit hoặc phím Elliptic-Curve (ECC) lớn hơn.
  • Chứng chỉ không hợp lệ dẫn đến kết quả không thành công và không có kết nối.
  • Các mật mã được chấp nhận là: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
+0

@ Cœur Đây là: [Link] (https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles /CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW57) – zvi

32

Tại dòng lệnh trong OS X, chạy như sau:

nscurl --ats-diagnostics https://filename.hostname.net --verbose

này sẽ cho bạn biết kết hợp các thiết lập ATS sẽ và sẽ không cho phép iOS truy cập trang web của bạn và sẽ cho bạn biết điều gì không đúng với trang web của bạn.

Nó có thể là một hoặc nhiều điều sau đây

  • Giấy chứng nhận thuật toán băm (phải là SHA-256 trở lên)
  • phiên bản TLS (phải là 1.2)
  • thuật toán TLS (phải cung cấp hoàn hảo Chuyển tiếp Bí mật)
+1

Như đã đề cập bởi @Codran, tôi đã có phản hồi giống hệt nhau và đã bỏ qua nó bằng phương pháp được đề cập. RDC, tôi sẽ tái tạo tình hình của bạn trên một máy chủ địa phương và sau đó cho bạn biết. – Fennec

+2

@codran, Đối với tôi ở trên lệnh cho thấy "Kết quả: PASS" cho mọi trường hợp và tôi cũng đã thêm cài đặt ATS trong info.plist của tôi, Nhưng, đôi khi tôi thấy các vấn đề liên quan đến SSL trên crashytics. Có suy nghĩ gì không? – JiteshW

+0

@JiteshW chính xác trường hợp của tôi. Không có gì, bên ngoài cho phép tải không an toàn hoàn toàn, hoạt động – Antek

2

Tôi có cùng một tình huống và bị kẹt trong một ngày. Hãy thử với dữ liệu di động của bạn, nếu điều này làm việc tốt với API của bạn, thì vấn đề với tường lửa mạng của bạn. sau đó bật SSL/TLS từ cài đặt tường lửa.

Các vấn đề liên quan