Bảo mật vận tải đã chặn HTTP rõ ràng


1451

Tôi cần cài đặt gì info.plistđể bật chế độ HTTP theo thông báo lỗi sau?

Bảo mật vận chuyển đã chặn tải tài nguyên HTTP (http: //) Cleartext vì nó không an toàn. Các ngoại lệ tạm thời có thể được định cấu hình qua tệp Info.plist của ứng dụng của bạn.

Xcode

Giả sử rằng tên miền của tôi là example.com.



15
Người điều hành Lưu ý : Hiện đã có 36 câu trả lời cho câu hỏi này. Trước khi thêm một cái khác , hãy chắc chắn rằng giải pháp của bạn là mới .
Matt

5
LƯU Ý: Các giải pháp ở đây đề nghị bạn nên tắt ATS ( Allow arbitary loads). Điều này sẽ không thể thực hiện được vì Apple sẽ yêu cầu ATS (Ban đầu là cuối năm - thời hạn đã được gia hạn) - developer.apple.com/news/?id=12212016b
Jakub Truhlář


@Jeef tại sao bạn đã thêm thẻ iOS 10? Có bất kỳ thay đổi bổ sung nào trong iOS 10 trong vấn đề đó không? Tôi cảm thấy rằng nó đã được giới thiệu trong iOS9 và thẻ đó phải đủ về các phiên bản iOS
Julian Król

Câu trả lời:


469

Nếu bạn đang sử dụng Xcode 8.0+ và Swift 2.2+ hoặc thậm chí là Objective C:

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

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

29
Tại sao được NSAllowsArbitraryLoadsđặt thành true? Bạn lật đổ mục đích của ATS. Xem thêm Mã nguy hiểm nhất thế giới: xác thực chứng chỉ SSL trong phần mềm không phải trình duyệt . Phần mềm của bạn chỉ cần làm cho danh sách.
ngày

6
@jww Đây là mục đích của bài viết này. Trang web tôi cần kết nối để phát âm thanh chưa sử dụng HTTPS và tôi không cố gắng chờ đợi.
ThinkDigital

5
Điều này sẽ không hoạt động trong iOS 10.0+ hoặc MacOS 10.12+ Nó thực sự nói rằng cho phép tất cả các tải tùy ý NGOẠI TRỪ những người được đề cập (example.com). Do đó, nó sẽ làm ngược lại những gì mong muốn. NS ALLowsArbirtraryLoads nên được đặt thành false ở đây. Thông tin thêm: Tài liệu của Apple
Freek Sanders

1
Đồng ý, tại sao mọi người lại ủng hộ điều này? không có điểm nào khi sử dụng NSAllowsArbitraryLoads nếu bạn đặt tên miền ngoại lệ.
thibaut noah

1
NS ALLowsArbitraryLoads không cần phải đúng, vì vậy nó phải được gỡ bỏ. NSExceptionDomains là đủ cho phép kết nối không an toàn với tên miền đó. NS ALLowsArbitraryLoads = true sẽ cho phép kết nối không an toàn với bất kỳ tên miền nào, vì vậy nếu việc đặt nó thành đúng sẽ khiến NSExceptionDomains trở nên vô nghĩa vì nó đã bao gồm tất cả các tên miền
mister_giga

950

Sử dụng NSAppTransportSecurance:

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

Bạn phải đặt khóa NSAllowsArbitraryLoads thành trong từ điển NSAppTransportSecurity trong tệp info.plist của bạn.

Cấu hình Plist


157
Hãy để nó được biết: ĐÂY LÀ MỘT CÔNG VIỆC! Bất cứ khi nào bạn đang sử dụng HTTP qua HTTPS, bạn sẽ mở (các) thiết bị của người dùng của mình cho các lỗ hổng. Chắc chắn nó không thể xảy ra trong nhiều trường hợp nhưng lập trình đạo đức là cách thực hành tốt nhất. Chỉ cần nói ... - đồng thời, +1 cho công việc (cho mục đích thử nghiệm)
Jacksonkr

36
Đây KHÔNG phải là một giải pháp - đây là một HACK! Để thêm tên miền "ngoại lệ", hãy xem câu trả lời dưới đây: stackoverflow.com/a/32560433/1103584
DiscDev

17
Mặc dù giải pháp này được biết là dễ bị tổn thương, nhưng đó là giải pháp duy nhất tôi muốn giới thiệu trong quá trình PHÁT TRIỂN . Phải gõ vào mọi miền chính xác trong quá trình phát triển chỉ là ngớ ngẩn (đặc biệt nếu bạn đang sử dụng dịch vụ web của bên thứ ba).
reTs

6
Tên của các khóa đó đã thay đổi ngay bây giờ "Cài đặt bảo mật vận chuyển ứng dụng" trong đó "Cho phép tải tùy ý"
vishal dharankar

11
Tại sao nhiều người chống lại giải pháp này? Đây chắc chắn không phải là một hack! Nhiều ứng dụng cần liên lạc với internet thực tế nơi giao thức bảo mật không phải lúc nào cũng nằm trong tầm kiểm soát của bạn. Ví dụ, có vẻ rất hợp lý khi có thể hiển thị hình ảnh từ các máy chủ khác không có chứng chỉ SSL.
Oren

825

Dưới đây là các cài đặt trực quan:

cài đặt hình ảnh cho NS ALLowsArbitraryLoads trong info.plist qua Xcode GUI


10
Tôi không có lựa chọn đó.
Người dùng

25
Nếu bạn trực tiếp mở Info.plist, bạn có thể chỉ cần thêm từ điển NSAppTransportSecurity , sau đó tạo mục NSAllowsArbitraryLoads trong đó (xem câu trả lời được chỉnh sửa bởi Umar Farooq, bên dưới).
Stoph

3
Tương tự ở đây - các miền ngoại lệ không hoạt động với 7.3 đối với tôi.
Thường xuyên xuất hiện

4
Tùy chọn này không tồn tại - XCode 7.3.1
jameshfisher

3
Thông tin từ @JoshPinter đã làm việc cho tôi với XCode 8.
Matthew Bellantoni

717

Xem bài diễn đàn Ứng dụng An ninh vận tải? .

Ngoài ra trang Cấu hình ngoại lệ bảo mật vận chuyển ứng dụng trong iOS 9 và OSX 10.11 .

Ví dụ: bạn có thể thêm một tên miền cụ thể như:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>example.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>

Tùy chọn lười biếng là:

<key>NSAppTransportSecurity</key>
<dict>
  <!--Include to allow all connections (DANGER)-->
  <key>NSAllowsArbitraryLoads</key>
      <true/>
</dict>

Ghi chú:

info.plist là một tệp XML để bạn có thể đặt mã này nhiều hơn hoặc ít hơn bất cứ nơi nào trong tệp.


1
Làm thế nào tôi có thể làm điều đó, ý tôi là cách thêm mã này vào Info.plist là gì vì tôi không biết dán mã này vào đâu?
lmiguelvargasf

2
@lmiguelvargasf mở thông tin của bạn.plist trong một trình soạn thảo văn bản đơn giản
Dan Beaulieu

7
Tôi vẫn nhận được lỗi: tên miền ngoại lệ được đặt và NS ALLowsArbitraryLoads là sai. Ngay cả với NS ALLowsArbitraryLoads, lỗi vẫn xuất hiện. Có ai khác ở đây có vấn đề này?
klaevv

3
Tính đến 2016/01/30 của Apple doc cho thấy các phím không còn có chữ tạm thời trong đó, ví dụ như: NSExceptionAllowsInsecureHTTPLoads NSExceptionMinimumTLSVersion Xem developer.apple.com/library/prerelease/ios/documentation/...
Philippe Monnet

3
Trong trường hợp bất kỳ ai khác đang nhổ tóc vì thực hiện những thay đổi đơn giản này cho thông tin.plist không hoạt động .. hãy thêm các thay đổi vào Project> Target> Thông tin> Thuộc tính mục tiêu iOS tùy chỉnh
BlueGuy 24/2/2016

330

Điều này đã được thử nghiệm và đang hoạt động trên hạt giống GM 9 của iOS - đây là cấu hình để cho phép một tên miền cụ thể sử dụng HTTP thay vì HTTPS:

<key>NSAppTransportSecurity</key>
<dict>
      <key>NSAllowsArbitraryLoads</key> 
      <false/>
       <key>NSExceptionDomains</key>
       <dict>
            <key>example.com</key> <!--Include your domain at this line -->
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSTemporaryExceptionMinimumTLSVersion</key>
                <string>TLSv1.1</string>
            </dict>
       </dict>
</dict>

NSAllowsArbitraryLoadsphải false, bởi vì nó không cho phép tất cả kết nối không an toàn, nhưng danh sách ngoại lệ cho phép kết nối với một số miền mà không có HTTPS.


7
Điều này nên được đánh dấu là câu trả lời. Đã thử nghiệm và làm việc trên hạt giống GM 9 của iOS để cho phép một tên miền cụ thể sử dụng http mà không cần thực hiện theo cách "lười biếng" và hoàn toàn mở ứng dụng của bạn lên.
DiscDev

2
Làm cách nào để thêm phần này vào thông tin của tôi?
JMStudios.jrichardson

8
Ok tôi đã thêm mục nhập đó vào thông tin của mình. Tôi vẫn gặp phải lỗi này - "App Transport Security đã chặn tải tài nguyên HTTP (http: //) rõ ràng vì nó không an toàn. Ngoại lệ tạm thời có thể được định cấu hình qua Thông tin ứng dụng của bạn tập tin .plist. "
KMC

2
@RomanShapovalov nếu bạn phải sử dụng địa chỉ IP, hãy thử thêm .xip.io vào cuối địa chỉ IP và thêm xip.io vào NSExceptionDomains của bạn. Xem xip.io . Tôi kết nối trực tiếp với IP khi phát triển (nhưng không phát hành) và điều này rất tốt cho tôi.
tpankake

2
Không làm việc cho tôi cho đến khi tôi nhận ra tôi đã đưa nó vào thông tin sai.plist trong dự án thử nghiệm của tôi. Hãy chắc chắn rằng bạn đặt nó đúng cách!
Chucky

144

Đây là một cách giải quyết nhanh chóng (nhưng không được khuyến nghị) để thêm phần này vào phần chính:

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

Có nghĩa là (theo tài liệu của Apple ):

NS ALLowsArbitraryLoads
Giá trị Boolean được sử dụng để vô hiệu hóa Bảo mật vận chuyển ứng dụng cho mọi tên miền không được liệt kê trong từ điển NSExceptionDomains. Các miền được liệt kê sử dụng các cài đặt được chỉ định cho miền đó.

Giá trị mặc định của NO yêu cầu hành vi Bảo mật vận chuyển ứng dụng mặc định cho tất cả các kết nối.

Tôi thực sự khuyên bạn nên liên kết:

giúp tôi hiểu lý do và tất cả các hàm ý.

XML (trong tệp Info.plist) bên dưới sẽ:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <false/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDE</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

không cho phép các cuộc gọi tùy ý cho tất cả các trang, nhưng PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDEsẽ cho phép các kết nối sử dụng giao thức HTTP.

Để XML ở trên, bạn có thể thêm:

<key>NSIncludesSubdomains</key>
<true/>

nếu bạn muốn cho phép các kết nối không an toàn cho các tên miền phụ của địa chỉ được chỉ định.

Cách tiếp cận tốt nhất là chặn tất cả các tải tùy ý (được đặt thành false) và thêm ngoại lệ để chỉ cho phép các địa chỉ mà chúng tôi biết là ổn.

Dành cho độc giả quan tâm

Cập nhật 2018:

Apple không khuyến nghị tắt điều này - có thể tìm thấy nhiều thông tin hơn trong phiên WWDC 2018 với nhiều điều được giải thích liên quan đến bảo mật

Để lại câu trả lời ban đầu vì lý do lịch sử và giai đoạn phát triển


1
NSAllowsArbitraryLoadsphải làfalse
Sound Blaster

@SoundBlaster cho trường hợp nào và những gì bạn thấy sai trong câu trả lời của tôi để bỏ phiếu?
Julian Król

bằng cách thêm vào plist (NSAppTransportSecurity NS ALLowsArbitraryLoads), tất cả các dịch vụ web đều hoạt động tốt, ngoại trừ một dịch vụ web trả về một lỗi máy chủ nội bộ (500) trong iOS 9 nhưng hoạt động tốt trong iOS8 trở lên
amup gupta

@SoundBlaster đã thực hiện một thay đổi, bây giờ bạn không nên phản đối :)
Julian Król

Cảm ơn, làm thế nào để bạn thực sự thêm <key>NSIncludesSubdomains</key> <true/>? Có phải mọi thiết lập phải được bao quanh bởi <dict>? Làm thế nào để bạn chỉnh sửa tập tin plist chết tiệt này? Định dạng là gì? : D Cảm ơn bạn.
Đặc vụ Zebra

116

Đối với những người bạn muốn có thêm một bối cảnh về lý do tại sao điều này xảy ra, ngoài cách khắc phục nó, hãy đọc bên dưới.

Với sự ra mắt của iOS 9, để cải thiện tính bảo mật của các kết nối giữa ứng dụng và dịch vụ web, các kết nối an toàn giữa ứng dụng và dịch vụ web phải tuân theo các thực tiễn tốt nhất . Hành vi thực hành tốt nhất được thi hành bởi App Transport Security để:

  • ngăn chặn tiết lộ tình cờ, và
  • cung cấp một hành vi mặc định là an toàn.

Như đã giải thích trong Công nghệ bảo mật vận chuyển ứng dụng , khi liên lạc với dịch vụ web của bạn, App Transport Security hiện có các yêu cầu và hành vi sau:

  • Máy chủ phải hỗ trợ ít nhất phiên bản giao thức TLS (Transport Layer Security) phiên bản 1.2.
  • Mật mã kết nối được giới hạn ở những mật mã cung cấp bảo mật chuyển tiếp (xem danh sách các mật mã bên dưới.)
  • Chứng chỉ phải được ký bằng thuật toán băm chữ ký SHA256 hoặc tốt hơn, với khóa RSA 2048 bit hoặc lớn hơn hoặc khóa Elliptic-Curve (ECC) 256 bit hoặc lớn hơn.
  • Chứng chỉ không hợp lệ dẫn đến lỗi cứng và không có kết nối.

Nói cách khác, yêu cầu dịch vụ web của bạn nên: a.) Sử dụng HTTPS và b.) Được mã hóa bằng TLS v1.2 với tính bảo mật chuyển tiếp.

Tuy nhiên, như đã được đề cập trong các bài đăng khác, bạn có thể ghi đè hành vi mới này từ App Transport Security bằng cách chỉ định miền không an toàn trong Info.plistứng dụng của bạn.


Để ghi đè, bạn sẽ cần thêm các thuộc tính NSAppTransportSecurity> NSExceptionDomainstừ điển vào Info.plist. Tiếp theo, bạn sẽ thêm tên miền của dịch vụ web vào NSExceptionDomainstừ điển.

Ví dụ: nếu tôi muốn bỏ qua hành vi Bảo mật vận chuyển ứng dụng cho một dịch vụ web trên máy chủ www.yourwebservicehost.com thì tôi sẽ làm như sau:

  1. Mở ứng dụng của bạn trong Xcode.

  2. Tìm Info.plisttệp trong Project Navigator và "chuột phải" nhấp vào tệp đó và chọn tùy chọn menu Mở dưới dạng > Mã nguồn . Tệp danh sách tài sản sẽ xuất hiện trong khung bên phải.

  3. Đặt khối thuộc tính sau bên trong từ điển thuộc tính chính (bên dưới đầu tiên <dict>).


<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Nếu bạn cần cung cấp ngoại lệ cho các tên miền bổ sung thì bạn sẽ thêm một thuộc tính từ điển khác bên dưới NSExceptionDomains.

Để tìm hiểu thêm về các khóa được tham chiếu ở trên, hãy đọc kỹ thuật này đã được đề cập .


1
Điều này hoạt động trong 2 ứng dụng của tôi, nhưng nó không hoạt động trên ứng dụng thứ 3. Có ai khác gặp phải tình huống sử dụng bản sửa lỗi trên mà vẫn nhận được thông báo lỗi tương tự không? (và vâng, tôi đã cập nhật từ điển để sử dụng tên miền API của mình chứ không phải tên miền trong mã)
helloB

Tốt ! Apple xác nhận rằng giải pháp này bằng cách sử dụng
YannSteph 6/10/2015

Điều này đã làm việc cho tệp chỉnh sửa ứng dụng Cordova / Phonegap / Ionic ./platforms/ios/<project>/<project>-Info.plistvới NSAllowsArbitraryLoads=falsenhiều tên miền ngoại lệ đối với các dịch vụ có các kết hợp TLS / HTTP / HTTPS khác nhau. Ban đầu được sử dụng NSAllowsArbitraryLoads=truesau đó điều chỉnh, xử lý sự cố các quy tắc thông qua thử nghiệm và lỗi để tuân thủ các nguyên tắc và trình phê duyệt. Lưu ý các config.xml <access origin=.../>câu lệnh điền một phần tệp này, nhưng hiện tại yêu cầu điều chỉnh bằng cách chỉnh sửa trực tiếp hoặc qua XCode để có được các chi tiết chính xác.
jimmont

Ngoài ra <access origin="*"/>(trong tệp config.xml) NSAllowsArbitraryLoads=true(dành cho ứng dụng Cordova / Phonegap / hybrid
jimmont

Tại sao được NSExceptionAllowsInsecureHTTPLoadsđặt thành true? Bạn lật đổ mục đích của ATS. Xem thêm Mã nguy hiểm nhất thế giới: xác thực chứng chỉ SSL trong phần mềm không phải trình duyệt . Phần mềm của bạn chỉ cần làm cho danh sách.
ngày

67

Tôi không thích chỉnh sửa trực tiếp. Bạn có thể dễ dàng thêm nó vào bảng bằng cách sử dụng GUI:

  • Nhấp vào Info.plist trong Bộ điều hướng bên trái.
  • Bây giờ thay đổi dữ liệu trong khu vực chính:

    • Trên dòng cuối cùng thêm +
    • Nhập tên của nhóm: Cài đặt bảo mật vận chuyển ứng dụng
    • Nhấp chuột phải vào nhóm và chọn Add Row
    • Nhập cho phép tải tùy ý
    • Đặt giá trị ở bên phải thành

Thí dụ


Để làm rõ: nếu "Cho phép tải tùy ý" là CÓ và có "Miền ngoại lệ", thì các tải được phép sẽ bị hạn chế đối với các miền trong Miền ngoại lệ. Đúng không?

Đó có phải là cách an toàn để làm điều đó nếu tôi muốn phát hành ứng dụng?
Lamour

Không. Bằng cách cho phép tải tùy ý, ứng dụng của bạn có thể tự do kết nối với bất kỳ miền nào. Theo quan điểm bảo mật, bạn nên kiểm soát & giới hạn ứng dụng nên kết nối với tên miền / trang web nào để tránh việc sử dụng mạng không mong muốn.
Raptor

Hầu hết các ứng dụng chỉ định tuyến đến các máy chủ được biết đến. Điều này được kiểm soát bởi nhà phát triển. Vì vậy, các vấn đề bảo mật được biết đến.
Vincent

Tại sao được NSAllowsArbitraryLoadsđặt thành YES? Bạn lật đổ mục đích của ATS. Xem thêm Mã nguy hiểm nhất thế giới: xác thực chứng chỉ SSL trong phần mềm không phải trình duyệt . Phần mềm của bạn chỉ cần làm cho danh sách.
ngày

25

Tài liệu Apple 1

Tài liệu Apple 2

Có hai giải pháp cho việc này:

Giải pháp 1:

  1. Trong Info.plisttệp thêm từ điển có khóa ' NSAppTransportSecurity'
  2. Thêm một yếu tố khác trong từ điển với khóa 'Allow Arbitrary Loads'

Plist cấu trúc sẽ xuất hiện như thể hiện trong hình ảnh dưới đây.

Giải pháp 1

Giải pháp 2:

  1. Trong Info.plisttệp thêm từ điển có khóa ' NSAppTransportSecurity'
  2. Thêm một yếu tố khác trong từ điển với khóa ' NSExceptionDomains'
  3. Thêm phần tử với khóa 'MyDomainName.com'loại NSDipedia
  4. Thêm phần tử với khóa ' NSIncludesSubdomains' của loại Booleanvà giá trị được đặt thànhYES
  5. Thêm phần tử với khóa ' NSTemporaryExceptionAllowsInsecureHTTPLoads' của loại Booleanvà giá trị được đặt thànhYES

Plist cấu trúc sẽ xuất hiện như thể hiện trong hình ảnh dưới đây.

Giải pháp 2

Giải pháp 2 được ưa thích vì nó chỉ cho phép miền được chọn trong khi giải pháp 1 cho phép tất cả các kết nối HTTP không an toàn.


Tại sao được NSAllowsArbitraryLoadsđặt thành YES? Bạn lật đổ mục đích của ATS. Xem thêm Mã nguy hiểm nhất thế giới: xác thực chứng chỉ SSL trong phần mềm không phải trình duyệt . Phần mềm của bạn chỉ cần làm cho danh sách.
ngày

20

Bảo mật vận chuyển có sẵn trên iOS 9.0 trở lên. Bạn có thể có cảnh báo này khi cố gắng gọi WS trong ứng dụng của mình:

Application Transport Security đã chặn tải tài nguyên HTTP (http: //) Cleartext vì nó không an toàn. Các ngoại lệ tạm thời có thể được định cấu hình qua tệp Info.plist của ứng dụng của bạn.

Thêm phần sau vào Info.plist của bạn sẽ vô hiệu hóa ATS:

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

1
NS ALLowsArbitraryLoads phải sai, nếu đúng, nó cho phép tất cả kết nối không an toàn
Thiago Arreguy

bằng cách thêm vào tất cả các dịch vụ web hoạt động tốt, ngoại trừ một dịch vụ web, một dịch vụ web trả về lỗi máy chủ nội bộ (500) trong iOS 9 nhưng hoạt động tốt trong iOS8 trở lên
amit gupta

1
Chấp nhận trên cửa hàng?
Vrashabh Irde

Lời khuyên rất tệ; xem Mã nguy hiểm nhất thế giới: xác nhận chứng chỉ SSL trong phần mềm không phải trình duyệt . Đưa ra câu hỏi nếu đầy đủ các cách được đề xuất để làm việc, câu trả lời "tôi cũng vậy" là không cần thiết.
ngày

15

Ví dụ phát triển

Dưới đây là một ảnh chụp màn hình của một plist giữ ATS nguyên vẹn (= an toàn), nhưng cho phép các kết nối đến localhost có thể được thực hiện thông qua HTTP thay vì HTTPS . Nó hoạt động trong Xcode 7.1.1.

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


Có cách nào để bảo mật localhost, tức là sử dụng HTTPS, trong Reac -igen để chúng ta không phải sử dụng NSExceptionAllowsInsecureHTTPLoads - YEScấu hình mặc định ?
vắt sữa

13

Truy cập Info.plist của bạn

  1. Nhấp chuột phải vào không gian trống và Nhấp vào Thêm hàng
  2. Viết tên khóa là NSAppTransportSecurance, bên dưới nó
  3. Chọn Tên miền ngoại lệ, Thêm một mục mới vào đây
  4. Viết tên miền của bạn cần được truy cập
  5. Thay đổi loại Tên miền từ Chuỗi thành Từ điển, thêm một Mục mới
  6. NSTceedException ALLowsInsecureHTTPLoads, đó sẽ là một boolean với giá trị thực. Nhìn vào bức tranh để theo dõi nó một cách chính xác

1
Tại sao được NSAllowsArbitraryLoadsđặt thành true? Bạn lật đổ mục đích của ATS. Xem thêm Mã nguy hiểm nhất thế giới: xác thực chứng chỉ SSL trong phần mềm không phải trình duyệt . Phần mềm của bạn chỉ cần làm cho danh sách.
ngày

13

Theo Apple, nói chung việc vô hiệu hóa ATS sẽ dẫn đến sự từ chối ứng dụng, trừ khi bạn có lý do chính đáng để làm điều đó. Thậm chí sau đó, bạn nên thêm ngoại lệ cho các tên miền mà bạn có thể truy cập một cách an toàn.

Apple có một công cụ tuyệt vời cho bạn biết chính xác những cài đặt nào sẽ sử dụng: Trong Terminal, nhập

/usr/bin/nscurl --ats-diagnostics --verbose https://www.example.com/whatever

và nscurl sẽ kiểm tra xem yêu cầu này có thất bại hay không, sau đó thử nhiều cài đặt khác nhau và cho bạn biết chính xác cái nào sẽ vượt qua và phải làm gì. Ví dụ: đối với một số URL của bên thứ ba mà tôi truy cập, lệnh này cho tôi biết rằng từ điển này vượt qua:

{
    NSExceptionDomains = {
        "www.example.com" = {
            NSExceptionRequiresForwardSecrecy = false;
        };
    };
}

Để phân biệt giữa các trang web của riêng bạn và các trang web bên thứ ba nằm ngoài tầm kiểm soát của bạn, hãy sử dụng, ví dụ, khóa NSThirdPartyExceptionRequiresForwardSecrecy.


1
công cụ tuyệt vời của nó để kiểm tra trước khi thực sự kiểm tra với ứng dụng. tiết kiệm thời gian. nhưng bất kỳ tài nguyên nào để đọc để hiểu ra lệnh này.
damithH

1
Công cụ thú vị. Trong trường hợp của tôi, nó phóng đại mọi thứ. Nó liệt kê ba khóa bao gồm NSExceptionAllowsInsecureHTTPLoads = true;, nhưng hóa ra là không cần thiết.
Hoàng tử Chris

11

Chỉ ra các cài đặt để sử dụng có thể được thực hiện tự động, như được đề cập trong kỹ thuật này :

/usr/bin/nscurl --ats-diagnostics --verbose https://your-domain.com

Rõ ràng, bạn cần OS X 10.11 (El Capitan) cho việc này.
ecotax

10

LƯU Ý: Miền ngoại lệ trong danh sách của bạn phải ở dạng LOWER-CASE.

Ví dụ: bạn đã đặt tên cho máy của mình là "MyAw đũaMacbook" trong Cài đặt-> Chia sẻ; máy chủ của bạn (cho mục đích thử nghiệm) đang chạy trên MyAw đũaMacbook.local: 3000 và ứng dụng của bạn cần gửi yêu cầu tới http: // MyAw đũaMacbook.local: 3000 / files ..., bạn sẽ cần chỉ định "myawesomemacbook. cục bộ "là miền ngoại lệ.

-

Thông tin của bạn sẽ chứa ...

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>myawesomemacbook.local</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow HTTP requests-->
      <key>NSExceptionAllowsInsecureHTTPLoads</key>
      <true/>
    </dict>
  </dict>
</dict>

9

Sử dụng:

Ảnh chụp màn hình để hiểu rõ hơn

Thêm một mục mới, NSAppTransportSecurity , trong tệp plist với loại Từ điển , sau đó thêm mục phụ NSAllowsArbitraryLoads trong từ điển loại Boolean và đặt giá trị bool . Điều này làm việc cho tôi.


1
NS ALLowsArbitraryLoads phải sai, nếu đúng, nó cho phép tất cả kết nối không an toàn
Thiago Arreguy

bằng cách thêm vào tất cả các dịch vụ web hoạt động tốt, ngoại trừ một dịch vụ web, một dịch vụ web sẽ trả về lỗi máy chủ nội bộ (500) trong iOS 9 nhưng hoạt động tốt trong iOS8 trở lên @ThiagoArreguy
amit gupta

Lời khuyên rất tệ; xem Mã nguy hiểm nhất thế giới: xác nhận chứng chỉ SSL trong phần mềm không phải trình duyệt . Đưa ra câu hỏi nếu đầy đủ các cách được đề xuất để làm việc, câu trả lời "tôi cũng vậy" là không cần thiết.
ngày

Tôi biết đó là một lời khuyên tồi, nhưng đó chỉ là một giải pháp cho chế độ phát triển mà thôi. Apple đã cung cấp cho chúng tôi sự linh hoạt, nếu nó tệ đến mức đó, họ sẽ không cho phép điều này.
Tejinder

9

Vào ngày 2015-09-25 (sau khi cập nhật Xcode vào ngày 2015-09-18):

Tôi đã sử dụng một phương pháp không lười biếng, nhưng nó không hiệu quả. Sau đây là những cố gắng của tôi.

Đầu tiên,

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.xxx.yyy.zzz</key>
        <dict>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Và thứ hai,

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.xxx.yyy.zzz</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Cuối cùng, tôi đã sử dụng phương pháp lười biếng:

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

Nó có thể là một chút không an toàn, nhưng tôi không thể tìm thấy giải pháp khác.


Tại sao được NSAllowsArbitraryLoadsđặt thànhtrue ? Bạn lật đổ mục đích của ATS. Xem thêm Mã nguy hiểm nhất thế giới: xác thực chứng chỉ SSL trong phần mềm không phải trình duyệt . Phần mềm của bạn chỉ cần làm cho danh sách.
ngày

9

Trong swift 4 và xocde 10 là thay đổi NS ALLowsArbitraryLoads thành Cho phép tải tùy ý. vì vậy nó sẽ trông như thế này:

<key>App Transport Security Settings</key>
<dict>
     <key>Allow Arbitrary Loads</key><true/>
</dict>

6

Có thể đáng để đề cập đến cách đến đó ...

Info.plist là một trong những tệp bên dưới Main.storyboard hoặc viewControll.swift.

Khi bạn nhấp vào nó lần đầu tiên, nó thường ở định dạng bảng, vì vậy hãy nhấp chuột phải vào tệp và 'mở dưới dạng' Mã nguồn và sau đó thêm mã bên dưới vào cuối, nghĩa là:

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

Sao chép dán mã ở trên

 "</dict>
</plist>"

đó là ở cuối


Tại sao được NSAllowsArbitraryLoadsđặt thành true? Bạn lật đổ mục đích của ATS. Xem thêm Mã nguy hiểm nhất thế giới: xác thực chứng chỉ SSL trong phần mềm không phải trình duyệt . Phần mềm của bạn chỉ cần làm cho danh sách.
ngày

5

Cập nhật cho Xcode 7.1, gặp sự cố 27.10.15:

Giá trị mới trong Info.plist là "Cài đặt bảo mật vận chuyển ứng dụng". Từ đó, từ điển này nên chứa:

  • Cho phép tải tùy ý = CÓ
  • Tên miền ngoại lệ (chèn vào đây tên miền http của bạn)

4

Đối với những người đến đây cố gắng tìm lý do tại sao WKWebView của họ luôn trắng và không tải gì (chính xác như được mô tả ở đây, làm cách nào để WKWebView hoạt động nhanh chóng và cho Ứng dụng macOS ):

Nếu tất cả các khoa học tên lửa ở trên không hoạt động, bạn hãy kiểm tra rõ ràng: cài đặt hộp cát

cài đặt hộp cát]

Là người mới sử dụng swift và ca cao, nhưng khá có kinh nghiệm trong lập trình Tôi đã dành khoảng 20 giờ để tìm giải pháp này. Không ai trong số hàng tá hướng dẫn hipster-iOS cũng như chú thích táo - không có gì đề cập đến hộp kiểm nhỏ này.


Trời ơi, cảm ơn bạn rất nhiều! Bạn đã lưu tôi cùng một tìm kiếm 20 giờ!
Brecht Machiels

2
không thấy rằng phần trong phần khả năng của mục tiêu (Xcode 9.4.1)
shim

3

Theo mặc định, iOS chỉ cho phép API HTTPS. Vì HTTP không an toàn, bạn sẽ phải tắt bảo mật vận chuyển ứng dụng. Có hai cách để vô hiệu hóa ATS: -

1. Thêm mã nguồn trong thông tin dự án.plist và thêm mã sau vào thẻ gốc.

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

2. Sử dụng thông tin dự án.

Nhấp vào dự án trên dự án trên khung bên trái, chọn dự án làm mục tiêu và chọn tab thông tin. Bạn phải thêm từ điển trong cấu trúc sau.

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


3

Làm thế nào để khắc phục nó?

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

Dưới đây là các bước để sửa nó.

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


1

Việc sử dụng NSExceptionDomainscó thể không áp dụng đồng thời một hiệu ứng do trang đích có thể tải tài nguyên (ví dụ: jstệp) từ các miền bên ngoài http. Nó có thể được giải quyết bằng cách thêm các tên miền bên ngoài vào NSExceptionDomains.

Để kiểm tra tài nguyên nào không thể tải được, hãy thử sử dụng Gỡ lỗi từ xa. Đây là một hướng dẫn: http://geeklearning.io/apache-cordova-and-remote-debugging-on-ios/


0

Đối với Cordova, nếu bạn muốn thêm nó vào ios.json, hãy làm như sau:

"NSAppTransportSecurity": [
   {
      "xml": "<dict><key>NSAllowsArbitraryLoads</key><true /></dict>"
   }
]

Và nó nên ở bên trong:

"*-Info.plist": {
   "parents": {
   }
}

Chỉ <access origin = "*" /> trong config.xml không hoạt động. Không chắc chắn nếu cả hai đều cần thiết, nhưng giải pháp ios.json đã niêm phong thỏa thuận cho tôi.
zeusstl

Tại sao được NSAllowsArbitraryLoadsđặt thành true? Bạn lật đổ mục đích của ATS. Xem thêm Mã nguy hiểm nhất thế giới: xác thực chứng chỉ SSL trong phần mềm không phải trình duyệt . Phần mềm của bạn chỉ cần làm cho danh sách.
ngày

-1

Giống như nhiều người đã lưu ý, đây là một vấn đề tính năng đi kèm với iOS 9.0. Họ đã thêm một thứ gọi là App Transport Security và tôi cũng thấy khó chịu khi nó phá vỡ Ứng dụng của mình.

Bạn có thể băng nó bằng khóa NS ALLowsArbitraryLoads thành CÓ trong từ điển NSAppTransportSecurity trong tệp .plist của bạn, nhưng cuối cùng bạn sẽ cần phải viết lại mã tạo thành URL của bạn để tạo tiền tố HTTPS: //.

Apple đã viết lại lớp NSUrlConnection trong iOS 9.0. Bạn có thể đọc về nó trong NSURLConnection .

Khác, bạn có thể phải sao lưu iOS 9.0 cho đến khi bạn có thời gian để thực hiện giải pháp chính xác.

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.