2015-07-10 35 views
7

Tôi đang xây dựng một ứng dụng iOS đơn giản nói chuyện với Firebase bằng REST API.iOS 9 ATS và Firebase REST

Về cơ bản, tôi đang sử dụng NSURLSession.sharedSession().dataTaskWithRequest để kết nối với

https://myusername.firebaseio.com/Object.json

Ứng dụng hoạt động tốt trong iOS 8. Tôi có thể vượt qua GET/PUT/PATCH/DELETE để thao tác dữ liệu của tôi. Nhưng kể từ khi iOS 9 giới thiệu ATS, tôi bây giờ có lỗi https:

NSURLSession/NSURLConnection HTTP load failed

(kCFStreamErrorDomainSSL, CFNetwork SSLHandshake failed)

tôi hoàn toàn nhận thức được những giải pháp workaround trong Info.plist. Tuy nhiên, tôi muốn sử dụng tính năng an toàn mới trong iOS 9.

Tôi đã kiểm tra bảo mật kết nối Firebase (bằng cách nhấp vào nút khóa màu xanh lá cây của Chrome) và dường như tương thích với yêu cầu ATS của Apple.

Lỗi của tôi có phải là cách tôi sử dụng NSURLSession không? Hay là do thiết lập bảo mật Firebase?

PS: Tôi đã kiểm tra https://firebase.com và NSURLSession kết nối lỗi tốt. Ứng dụng của tôi cũng đủ đơn giản mà tôi không yêu cầu auth.

Cảm ơn sự giúp đỡ của bạn.

+0

Thật khó để đoán những gì iOS là không hài lòng về từ lỗi đó. Nếu bạn tìm cách tìm hiểu thêm thông tin chi tiết về lỗi, hãy gửi email cho chúng tôi theo địa chỉ [email protected] và chúng tôi có thể xác định xem iOS có không thích gì về cấu hình SSL của chúng tôi hay không. –

+0

cảm ơn bạn. Tôi sẽ sao chép thông báo lỗi và hỗ trợ qua email. – User5103156

Trả lời

13

TL; DR: Nó phải làm với các mật mã SSL Máy chủ Firebase cho phép (ATS yêu cầu ECDHE chỉ ra khỏi hộp).

Như đã đề cập, các workaround trong Info.plist là thêm những điều sau đây:

<key>NSAppTransportSecurity</key> 
    <dict> 
     <key>NSExceptionDomains</key> 
     <dict> 
      <key>firebaseio.com</key> 
      <dict> 
       <key>NSIncludesSubdomains</key> 
       <true/> 
       <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> 
       <false/> 
      </dict> 
     </dict> 
    </dict> 

Trong ATS docs, Apple chỉ cho phép sau đây ra khỏi hộp:

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 

Thiết lập NSThirdPartyExceptionRequiresForwardSecrecy gắn cờ đến NO trong Info.plist thêm các địa chỉ bổ sung sau:

TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 
TLS_DHE_RSA_WITH_AES_256_CBC_SHA 
TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 
TLS_DHE_RSA_WITH_AES_128_CBC_SHA 
TLS_RSA_WITH_AES_256_GCM_SHA384 
TLS_RSA_WITH_AES_128_GCM_SHA256 
TLS_RSA_WITH_AES_256_CBC_SHA256 
TLS_RSA_WITH_AES_256_CBC_SHA 
TLS_RSA_WITH_AES_128_CBC_SHA256 
TLS_RSA_WITH_AES_128_CBC_SHA 

Tôi không đồng ý với việc đặt tên cho cờ là "... ExceptionRequiresForwardSecrecy" vì kỹ thuật DHE cung cấp tính bảo mật chuyển tiếp hoàn hảo, nó chỉ chậm hơn so với các phiên bản ECDHE tương đương. Âm thanh với tôi như có nên có hai lá cờ, một là ngoại lệ để chuyển tiếp bí mật và một trong đó chỉ nói rằng bạn đang cảm thấy thoải mái có một cái bắt tay chậm hơn.

Về mặt kỹ thuật, bạn cũng có thể đặt tên miền trừ <your-firebase-app>.firebaseio.com và không có cờ NSIncludesSubdomains, nhưng tôi muốn làm cho điều này đủ chung chung.

Vì chúng tôi cho phép mật mã không phải ECDHE, Firebase sẽ không cho phép phía máy chủ làm việc này ra khỏi hộp (trừ khi nhà phát triển muốn bắt đầu rối tung với các công cụ cấp thấp hơn NSURLRequest, xem this SO post để biết thêm thông tin về định cấu hình Mật mã SSL, nhưng bạn sẽ dành nhiều thời gian làm việc đó hơn là thêm một vài dòng vào Info.plist).

Bảo mật, chúng tôi đang cung cấp các phiên bản so sánh cùng mật mã, không sử dụng phiên bản Elliptic Curves (cung cấp cải thiện hiệu suất tốt, nhưng loại trừ một số trình duyệt nhất định [đặc biệt là trình duyệt di động]). Thông tin thêm về DHE và ECDHE (và một số nền tảng SSL khác tốt đẹp là w.r.t Forward Secrecy là here).

Đối với những gì nó có giá trị, khách hàng thời gian thực không có vấn đề này, vì vậy tôi rất muốn giới thiệu cách sử dụng những kinh nghiệm cho một căn cứ hỏa lực tốt hơn :)

+2

Cảm ơn bạn đã bình luận. Tôi đã chuyển sang SDK Firebase. Chỉ muốn đề cập đến XCode 7 đặt ENABLE_BITCODE thành có theo mặc định và sẽ ném lỗi với SDK Firebase. Đặt nó thành NO sẽ xóa thông báo. Bạn có khung thời gian nào khi SDK mới xuất hiện không? – User5103156

+0

@ User5103156 Chúng tôi sẽ xem xét ENABLE_BITCODE và liệu chúng tôi có thể đặt nó trên SDK Firebase hay không. Cảm ơn cho những người đứng đầu lên! –

+0

Điều này giải quyết được vấn đề của tôi. Ngàn lần cám ơn! –

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