iOS9 ได้รับข้อผิดพลาด“ เกิดข้อผิดพลาด SSL และไม่สามารถทำการเชื่อมต่อที่ปลอดภัยกับเซิร์ฟเวอร์ได้”


109

เนื่องจากฉันอัปเกรดโครงการที่มีอยู่ด้วย iOS 9 ฉันได้รับข้อผิดพลาดเรื่อย ๆ :

เกิดข้อผิดพลาด SSL และไม่สามารถทำการเชื่อมต่อที่ปลอดภัยกับเซิร์ฟเวอร์ได้


3
มันเป็นข้อผิดพลาดของพร็อกซีในกรณีของฉันค้นหาคำตอบที่นี่ stackoverflow.com/a/34787953/3840428
Nagarjun

คำตอบ:


124

สำหรับ iOS9, แอปเปิ้ลได้ตัดสินใจที่รุนแรงกับ iOS 9 ปิดการจราจร HTTP ที่ไม่มีหลักประกันจากแอป iOS เป็นส่วนหนึ่งของApp ขนส่งการรักษาความปลอดภัย (ATS)

หากต้องการปิดใช้งาน ATS คุณสามารถทำตามขั้นตอนนี้ได้โดยเปิดInfo.plistและเพิ่มบรรทัดต่อไปนี้:

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

46
ฉันเพิ่มบรรทัดด้านบนใน plist แต่ยังคงได้รับข้อผิดพลาดต่อไปนี้: เกิดข้อผิดพลาด SSL และไม่สามารถทำการเชื่อมต่อที่ปลอดภัยกับเซิร์ฟเวอร์ได้ NSLocalizedRecoverySuggestion = คุณต้องการเชื่อมต่อกับเซิร์ฟเวอร์ต่อไปหรือไม่, _kCFNetworkCFStreamSSLErrorOriginalValue = -9819 ฉันกำลังเรียกคำขอ HTTPS มีตัวเลือกอื่นสำหรับ HTTPS หรือไม่?
AiOsN

1
AiOsN = ปัญหาเดียวกันที่นี่คุณพบวิธีแก้ไขหรือไม่?
Franck

5
ดูเหมือนว่าจะเป็นการตีความที่ผิดโดยทั่วไป NSAllowsArbitraryLoads เป็นสวิตช์เพื่อเปิดหรือปิดใช้งาน ATS ทันทีที่คุณทำคำขอ https: // คุณต้องตรวจสอบให้แน่ใจว่าคุณมีคุณสมบัติตรงตามข้อกำหนด ATS: ใบรับรองที่ถูกต้องที่ติดตั้งบนเซิร์ฟเวอร์ (ไม่มีสัญลักษณ์แทนตรงกับชื่อโดเมนของเซิร์ฟเวอร์ทุกประการ) เซิร์ฟเวอร์รองรับ TLS 1.2 พร้อมส่งต่อ ความลับ
Christian

@ คริสเตียนที่มาของข้อกำหนด ATS เหล่านี้คืออะไร? ฉันไม่พบสิ่งใดเกี่ยวกับการไม่รองรับใบรับรองตัวแทน
บาร์ต

@Bartosz ขออภัยฉันไม่สามารถชี้ให้คุณดูเอกสารอย่างเป็นทางการได้มันเป็นเพียงสิ่งที่เราสังเกตเห็นเมื่ออัปเดตโครงสร้างพื้นฐานเซิร์ฟเวอร์ของเรา
คริสเตียน

65

แม้ว่าการอนุญาตให้โหลดโดยพลการ ( NSAllowsArbitraryLoads = true) เป็นวิธีแก้ปัญหาที่ดี แต่คุณไม่ควรปิดใช้งาน ATS ทั้งหมด แต่ควรเปิดใช้งานการเชื่อมต่อ HTTP ที่คุณต้องการอนุญาต:

<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
ดีกว่าการเพิกเฉยต่อปัญหาด้านความปลอดภัยทั้งหมด บริการ S3 ของ Amazon ใช้การเข้ารหัสที่อ่อนแอและการโหลดโดยตรงไปยังเซิร์ฟเวอร์ของพวกเขาทำให้เกิดปัญหา แต่สิ่งนี้ทำให้เราสามารถเปิดได้เฉพาะ url s3.amazonaws.com ทำให้ส่วนที่เหลืออยู่ในบรรทัด สุดยอด!
mix3d

3
เซิร์ฟเวอร์ที่ฉันพยายามเข้าถึงใช้ TLSv1.0 ฉันต้องเพิ่ม NSExceptionMinimumTLSVersion สำหรับ tls1.0 เพื่อข้ามข้อผิดพลาด SLL
Ispas Claudiu

คำตอบนี้ใช้ได้ผลสำหรับฉัน ฉันใช้ WKWebView และพยายามส่งคำขอ SSL ไปยังเซิร์ฟเวอร์ API
Fan Jin

สวัสดี @ Stéphaneฉันมีสถานการณ์แปลก ๆ โทรศัพท์ของฉันมี iOS เวอร์ชัน 12.1.2 แต่ฉันพบข้อผิดพลาด "เกิดข้อผิดพลาด SSL และไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้อย่างปลอดภัย" สิ่งที่ฉันทำคืออัปเดตไฟล์ plist ของฉัน แอปทำงานได้ดีและอีกครั้งฉันลบการเปลี่ยนแปลงที่ทำใน info.plist ตอนนี้มันทำงานได้ดี ดังนั้นฉันจึงไม่สามารถหาสาเหตุที่แท้จริงของข้อผิดพลาดนี้ได้ ข้อเสนอแนะใด ๆ ?
Mansuu ....

@Mansuu .... คุณลองใช้ TLSv1.0 ตามที่แนะนำในความเห็นข้างบนหรือยัง
Stéphane Bruckert

15

iOS 9 บังคับให้การเชื่อมต่อที่ใช้ HTTPS เป็น TLS 1.2 เพื่อหลีกเลี่ยงช่องโหว่ล่าสุด ใน iOS 8 ยังรองรับการเชื่อมต่อ HTTP ที่ไม่ได้เข้ารหัสดังนั้น TLS เวอร์ชันเก่าก็ไม่ทำให้เกิดปัญหาเช่นกัน วิธีแก้ปัญหาเบื้องต้นคุณสามารถเพิ่มข้อมูลโค้ดนี้ใน Info.plist ของคุณ:

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

* อ้างอิงถึงApp Transport Security (ATS)

ป้อนคำอธิบายภาพที่นี่


1
สำหรับ Swift 4+ การตั้งค่าความปลอดภัยของการขนส่งแอป -> อนุญาตการโหลดตามอำเภอใจ = ใช่
mehdigriche

14

หากคุณกำหนดเป้าหมายเฉพาะโดเมนคุณสามารถลองเพิ่มสิ่งนี้ใน Info.plist ของแอปพลิเคชันของคุณ:

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

สิ่งนี้ไม่ได้ผลสำหรับฉัน ใช่ฉันใส่โดเมนที่ถูกต้องสำหรับ "example.com"
Alyoshak

1
มันทำงานสำหรับฉัน เมื่อฉันทำตัวอย่างเฉพาะกับงาน "อนุญาตการโหลดตามอำเภอใจ" แต่หลังจากหยุดทำงาน เมื่อฉันใช้คีย์ "NSExceptionRequiresForwardSecrecy" -> false และ "NSIncludesSubdomains" -> true จะทำงานได้อย่างสมบูรณ์ ขอบคุณมาก!
linhadiretalipe

1
สิ่งนี้ได้ผลสำหรับฉันเช่นกัน! แม้ว่าฉันจะใช้การเชื่อมต่อ https แต่ฉันก็ยังประสบปัญหา ไม่มีการสนับสนุนสำหรับ 'NSExceptionRequiresForwardSecrecy' ในขณะนี้ จากสิ่งที่ฉันอ่านสิ่งนี้ไม่จำเป็นต้องระบุก่อนหน้านี้ แต่ดูเหมือนว่าตอนนี้พวกเขาได้บังคับใช้แล้วเช่นกัน PS: ฉันกำลังลองกับ iOS 10.2.1
Vaibhav Misra

6

ดูเหมือนว่า iOS 9.0.2 จะหยุดการร้องขอไปยังปลายทาง HTTPS ที่ถูกต้อง ความสงสัยในปัจจุบันของฉันคือต้องการใบรับรอง SHA-256 หรือล้มเหลวด้วยข้อผิดพลาดนี้

ในการสร้างซ้ำให้ตรวจสอบ UIWebView ของคุณด้วยซาฟารีและลองนำทางไปยังจุดสิ้นสุด HTTPS โดยพลการ:

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)

ตอนนี้ลองไปที่ google (เพราะแน่นอนว่าพวกเขามีใบรับรอง SHA-256):

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

การเพิ่มข้อยกเว้นสำหรับความปลอดภัยในการขนส่ง (ตามที่ระบุไว้ในคำตอบของ@stéphane-bruckert ด้านบน) จะช่วยแก้ไขปัญหานี้ได้ ฉันยังคิดว่าการปิดใช้งานอย่างสมบูรณ์NSAppTransportSecurityก็ใช้ได้เช่นกันแม้ว่าฉันได้อ่านแล้วว่าการปิดใช้งานโดยสมบูรณ์อาจเป็นอันตรายต่อการตรวจสอบแอปของคุณ

[แก้ไข] ฉันพบว่าการระบุโดเมนที่ฉันเชื่อมต่อด้วยในการเขียนตามคำบอกจะNSExceptionDomainsช่วยแก้ปัญหานี้ได้แม้ว่าจะปล่อยให้NSExceptionAllowsInsecureHTTPLoadsตั้งค่าเป็นจริงก็ตาม : \


2

ปัญหาคือใบรับรอง ssl ที่ฝั่งเซิร์ฟเวอร์ มีบางอย่างรบกวนหรือใบรับรองไม่ตรงกับบริการ ตัวอย่างเช่นเมื่อไซต์มีใบรับรอง ssl สำหรับ www.mydomain.com ในขณะที่บริการที่คุณใช้ทำงานบน myservice.mydomain.com นั่นคือเครื่องที่แตกต่างกัน


ฉันได้รับปัญหาเกี่ยวกับ URL บางรายการ แต่ไม่ใช่ URL อื่นที่อยู่ IP เดียวกัน (โดเมนและเซิร์ฟเวอร์)
user6631314

2

ฉันได้รับข้อผิดพลาดเดียวกันเมื่อฉันระบุฉัน HTTPS URL ที่เป็น: https://www.mywebsite.com แต่ก็ทำงานได้ดีเมื่อฉันระบุได้โดยไม่ต้องสาม W เป็น: https://mywebsite.com


0

โครงการ Xcode -> goto info.plist และคลิกปุ่ม + จากนั้นเพิ่ม (App Transport Security Settings) ขยายอนุญาตการโหลดตามอำเภอใจตั้งใช่ ขอบคุณ


@AbdulYasin ตรวจสอบ plist ของคุณและตรวจสอบการเปลี่ยนแปลงสภาพอากาศมีการปรับปรุงหรือไม่?
Shanmugasundharam

1
คำตอบแบบ "สบาย ๆ " นี้ไม่รวมถึงคำอธิบายและความเสี่ยงด้านความปลอดภัยที่เกี่ยวข้องกับวิธีแก้ปัญหานี้โดยสิ้นเชิง
Manuel


0

ในกรณีของฉันฉันประสบปัญหานี้ในโปรแกรมจำลองของฉันเนื่องจากวันที่ในคอมพิวเตอร์ของฉันอยู่หลังวันที่ปัจจุบัน ดังนั้นโปรดตรวจสอบกรณีนี้ด้วยเมื่อคุณพบข้อผิดพลาด SSL


0

ฉันได้รับข้อผิดพลาดด้านล่างในการเล่น

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>

ฉันตรวจสอบให้แน่ใจว่าฉันได้เพิ่มรายการในโดเมนข้อยกเว้นในไฟล์ plist และ NSAllowsArbitraryLoads ถูกตั้งค่าเป็น true แต่ฉันก็ยังเห็นข้อผิดพลาด

จากนั้นฉันก็รู้ว่าฉันกำลังเล่น URL ด้วย https ไม่ใช่ http

ฉันตั้งค่า URL ของวิดีโอเป็น http และแก้ไขปัญหาแล้ว


0

ฉันได้รับข้อผิดพลาดนี้สำหรับการโทรในเครือข่ายบางสายไม่ใช่คนอื่น ๆ ฉันเชื่อมต่อกับ wifi สาธารณะ wifi ฟรีนั้นดูเหมือนจะยุ่งกับ URL บางอย่างและด้วยเหตุนี้ข้อผิดพลาด

เมื่อฉันเชื่อมต่อกับ LTE ข้อผิดพลาดนั้นก็หายไป!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.