iOS9 gặp lỗi "đã xảy ra lỗi SSL và không thể thực hiện kết nối an toàn với máy chủ"


Câu trả lời:


123

Đối với iOS9, Apple đã đưa ra một quyết định triệt để với iOS 9, vô hiệu hóa tất cả lưu lượng HTTP không an toàn từ các ứng dụng iOS, như một phần của App Transport Security (ATS) .

Để đơn giản tắt ATS, bạn có thể làm theo các bước sau bằng cách mở Info.plist và thêm các dòng sau:

<key>NSAppTransportSecurity</key>
  <dict>
      <key>NSAllowsArbitraryLoads</key>
      <true/>
  </dict>

45
Tôi đã thêm các dòng trên trong plist, nhưng vẫn gặp lỗi sau: Đã xảy ra lỗi SSL và không thể thực hiện kết nối an toàn với máy chủ. NSLocalizedRecoverySuggestion = Bạn có muốn kết nối với máy chủ không ?, _kCFNetworkCFStreamSSLErrorOriginalValue = -9819 Tôi đang gọi yêu cầu HTTPS. Có tùy chọn nào khác cho HTTPS không?
AiOsN

1
AiOsN = cùng một vấn đề ở đây, bạn đã tìm ra giải pháp chưa?
Franck

5
Có vẻ như đây là một cách hiểu sai phổ biến, rằng NSAllowsArbitraryLoads là một công tắc để bật hoặc tắt ATS. Ngay sau khi thực hiện yêu cầu https: //, bạn phải đảm bảo đáp ứng các yêu cầu ATS: chứng chỉ hợp lệ được cài đặt trên máy chủ (không có ký tự đại diện, khớp chính xác với tên miền của máy chủ), máy chủ hỗ trợ TLS 1.2 trở đi bí mật.
Christian

@Christian Nguồn của các yêu cầu ATS này là gì? Tôi không tìm thấy gì về việc không hỗ trợ chứng chỉ ký tự đại diện.
Bart

@Bartosz Xin lỗi, tôi không thể chỉ cho bạn tài liệu chính thức, đó chỉ là thông tin mà chúng tôi đã quan sát được khi cập nhật cơ sở hạ tầng máy chủ của mình.
Christian

64

Mặc dù cho phép tải tùy ý ( NSAllowsArbitraryLoads = true) là một giải pháp tốt, bạn không nên tắt hoàn toàn ATS mà hãy bật kết nối HTTP mà bạn muốn cho phép:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>yourserver.com</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow HTTP requests-->
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSTemporaryExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

2
Tốt hơn nhiều so với việc bỏ qua tất cả các vấn đề bảo mật. Dịch vụ S3 của Amazon sử dụng mã hóa yếu và việc tải trực tiếp đến máy chủ của họ đã gây ra sự cố, nhưng điều này cho phép chúng tôi chỉ mở url s3.amazonaws.com, giữ phần còn lại nội tuyến. Tuyệt vời!
mix3

3
Máy chủ mà tôi đang cố truy cập đang sử dụng TLSv1.0. Tôi đã phải thêm NSExceptionMinimumTLSVersion cho tls1.0 để bỏ qua lỗi SLL
Ispas Claudiu

Câu trả lời này đã làm việc cho tôi. Tôi đang sử dụng WKWebView và cố gắng thực hiện yêu cầu SSL tới máy chủ API.
Fan Jin

Xin chào @ Stéphane, tôi gặp một tình huống kỳ lạ. Điện thoại của tôi đang có phiên bản iOS 12.1.2, nhưng tôi gặp lỗi "Đã xảy ra lỗi SSL và không thể thực hiện kết nối an toàn với máy chủ". Những gì tôi đã làm là cập nhật tệp plist của tôi. Ứng dụng chạy tốt và một lần nữa tôi đã xóa các thay đổi mà tôi đã thực hiện trong info.plist. Bây giờ nó đang chạy tốt. Vì vậy, tôi không thể tìm ra lý do thực sự cho lỗi này. Bất kì lời đề nghị nào?
Mansuu ....

@Mansuu .... bạn đã thử sử dụng TLSv1.0 như được đề xuất trong các nhận xét ở trên chưa?
Stéphane Bruckert

15

iOS 9 buộc các kết nối đang sử dụng HTTPS phải là TLS 1.2 để tránh các lỗ hổng gần đây. Trong iOS 8, ngay cả các kết nối HTTP không được mã hóa cũng được hỗ trợ, do đó các phiên bản cũ hơn của TLS cũng không gây ra bất kỳ vấn đề nào. Để giải quyết vấn đề, bạn có thể thêm đoạn mã này vào Info.plist của mình:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

* tham chiếu đến App Transport Security (ATS)

nhập mô tả hình ảnh ở đây


1
Đối với Swift 4+, App Giao thông vận tải Security Settings -> Cho phép tải Arbitrary = YES
mehdigriche

14

Nếu bạn chỉ đang nhắm mục tiêu các miền cụ thể, bạn có thể thử và thêm điều này vào Info.plist của ứng dụng của bạn:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Điều này đã không làm việc cho tôi. Có, tôi đã đặt đúng miền cho "example.com".
Alyoshak

1
Nó làm việc cho tôi. khi tôi thực hiện ví dụ chỉ với tác phẩm "Cho phép tải tùy ý" nhưng sau khi dừng lại. Khi tôi sử dụng khóa "NSExceptionRequiresForwardSecrecy" -> false và "NSIncludesSubdomains" -> true, nó hoạt động hoàn hảo. Cảm ơn rất nhiều!
linhadiretalipe

1
Cái này cũng có tác dụng với tôi! Mặc dù tôi đang sử dụng kết nối https, tôi vẫn gặp sự cố. Hiện không có hỗ trợ nào cho 'NSExceptionRequiresForwardSecrecy'. Từ những gì tôi đọc, điều này không cần thiết phải chỉ định trước đó, nhưng có vẻ như bây giờ họ cũng đã bắt buộc điều này. Tái bút: Tôi đang thử với iOS 10.2.1
Vaibhav Misra

6

Có vẻ như iOS 9.0.2 phá vỡ các yêu cầu đến các điểm cuối HTTPS hợp lệ. Mối nghi ngờ hiện tại của tôi là nó đang yêu cầu chứng chỉ SHA-256 hoặc nó không thành công với lỗi này.

Để tái tạo, hãy kiểm tra UIWebView của bạn bằng safari và thử điều hướng đến một điểm cuối HTTPS tùy ý:

location.href = "https://d37gvrvc0wt4s1.cloudfront.net/js/v1.4/rollbar.min.js"
// [Error] Failed to load resource: An SSL error has occurred and a secure connection to the server cannot be made. (rollbar.min.js, line 0)

Bây giờ hãy thử vào google (vì tất nhiên họ có chứng chỉ SHA-256):

location.href = "https://google.com"
// no problemo

Thêm một ngoại lệ cho bảo mật truyền tải (như được nêu trong câu trả lời của @ stéphane-bruckert ở trên) có tác dụng khắc phục điều này. Tôi cũng giả định rằng việc tắt hoàn toàn NSAppTransportSecuritycũng sẽ hoạt động, mặc dù tôi đã đọc rằng việc tắt hoàn toàn nó có thể gây nguy hiểm cho việc xem xét ứng dụng của bạn.

[EDIT] Tôi thấy rằng chỉ cần liệt kê các miền mà tôi đang kết nối trong NSExceptionDomainsdict sẽ khắc phục được sự cố này, ngay cả khi NSExceptionAllowsInsecureHTTPLoadsđặt thành true. : \


2

Vấn đề là chứng chỉ ssl ở phía máy chủ. Có điều gì đó đang gây nhiễu hoặc chứng chỉ không khớp với dịch vụ. Ví dụ: khi một trang web có chứng chỉ ssl cho www.mydomain.com trong khi dịch vụ bạn sử dụng chạy trên myservice.mydomain.com. Đó là một chiếc máy khác.


Tôi gettng vấn đề với một số url nhưng không phải người khác tại cùng một địa chỉ IP (tên miền và máy chủ)
user6631314


0

Dự án Xcode -> goto info.plist và Nhấp vào + Nút rồi Thêm (Cài đặt bảo mật truyền tải ứng dụng) Mở rộng, Cho phép tải tùy ý Đặt YES. Cảm ơn


@AbdulYasin kiểm tra plist của bạn và kiểm tra thời tiết thay đổi có được cập nhật hay không?
Shanmugasundharam

1
Câu trả lời "thoải mái" này hoàn toàn bỏ qua phần giải thích và các rủi ro bảo mật liên quan đến giải pháp này.
Manuel,


0

Trong trường hợp của tôi, tôi gặp phải sự cố này trong trình mô phỏng của mình vì ngày máy tính của tôi bị trễ hơn so với ngày hiện tại. Vì vậy, hãy kiểm tra trường hợp này khi bạn gặp lỗi SSL.


0

Tôi gặp lỗi dưới đây khi phát lại

finished with error [-1200] Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSErrorFailingURLStringKey=https://remote-abcabc-svc.an.abc.com:1935/abr/_definst_/smil:v2/video/492F2F82592F59EA74ABAA6B9D6E6F42/F6B1BD452132329FBACD32730862CAE0/091EAD80FE9BEDD52A2F33840CA3CBAC.v3.eng.smil/playlist.m3u8, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <692A1174-DA1C-4267-9560-9020A79F8458>.<1>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <692A1174-DA1C-4267-9560-9020A79F8458>

Tôi đã đảm bảo rằng tôi đã thêm mục nhập trong các miền ngoại lệ trong tệp plist và NSAllowsArbitraryLoads được đặt thành true và tôi vẫn thấy lỗi.

Sau đó, tôi nhận ra rằng tôi đang chơi URL bằng https chứ không phải http.

Tôi đặt url video thành http và vấn đề đã được giải quyết.


0

Tôi gặp lỗi này đối với một số cuộc gọi mạng chứ không phải những cuộc gọi khác. Tôi đã kết nối với một wifi công cộng. Wi-Fi miễn phí đó dường như đã can thiệp vào một số URL nhất định và do đó xảy ra lỗi.

Khi tôi kết nối với LTE, lỗi đó đã biến mất!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.