เนื่องจากฉันอัปเกรดโครงการที่มีอยู่ด้วย iOS 9 ฉันได้รับข้อผิดพลาดเรื่อย ๆ :
เกิดข้อผิดพลาด SSL และไม่สามารถทำการเชื่อมต่อที่ปลอดภัยกับเซิร์ฟเวอร์ได้
เนื่องจากฉันอัปเกรดโครงการที่มีอยู่ด้วย iOS 9 ฉันได้รับข้อผิดพลาดเรื่อย ๆ :
เกิดข้อผิดพลาด SSL และไม่สามารถทำการเชื่อมต่อที่ปลอดภัยกับเซิร์ฟเวอร์ได้
คำตอบ:
สำหรับ iOS9, แอปเปิ้ลได้ตัดสินใจที่รุนแรงกับ iOS 9 ปิดการจราจร HTTP ที่ไม่มีหลักประกันจากแอป iOS เป็นส่วนหนึ่งของApp ขนส่งการรักษาความปลอดภัย (ATS)
หากต้องการปิดใช้งาน ATS คุณสามารถทำตามขั้นตอนนี้ได้โดยเปิดInfo.plistและเพิ่มบรรทัดต่อไปนี้:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
แม้ว่าการอนุญาตให้โหลดโดยพลการ ( 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>
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)
หากคุณกำหนดเป้าหมายเฉพาะโดเมนคุณสามารถลองเพิ่มสิ่งนี้ใน 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>
ดูเหมือนว่า 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
ตั้งค่าเป็นจริงก็ตาม : \
ปัญหาคือใบรับรอง ssl ที่ฝั่งเซิร์ฟเวอร์ มีบางอย่างรบกวนหรือใบรับรองไม่ตรงกับบริการ ตัวอย่างเช่นเมื่อไซต์มีใบรับรอง ssl สำหรับ www.mydomain.com ในขณะที่บริการที่คุณใช้ทำงานบน myservice.mydomain.com นั่นคือเครื่องที่แตกต่างกัน
โครงการ Xcode -> goto info.plist และคลิกปุ่ม + จากนั้นเพิ่ม (App Transport Security Settings) ขยายอนุญาตการโหลดตามอำเภอใจตั้งใช่ ขอบคุณ
ปัญหาของฉันคือNSURLConnection
และเลิกใช้แล้วใน iOS9 ดังนั้นฉันจึงเปลี่ยน API ทั้งหมดเป็นNSURLSession
และแก้ไขปัญหาของฉันได้
ในกรณีของฉันฉันประสบปัญหานี้ในโปรแกรมจำลองของฉันเนื่องจากวันที่ในคอมพิวเตอร์ของฉันอยู่หลังวันที่ปัจจุบัน ดังนั้นโปรดตรวจสอบกรณีนี้ด้วยเมื่อคุณพบข้อผิดพลาด SSL
ฉันได้รับข้อผิดพลาดด้านล่างในการเล่น
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 และแก้ไขปัญหาแล้ว
ฉันได้รับข้อผิดพลาดนี้สำหรับการโทรในเครือข่ายบางสายไม่ใช่คนอื่น ๆ ฉันเชื่อมต่อกับ wifi สาธารณะ wifi ฟรีนั้นดูเหมือนจะยุ่งกับ URL บางอย่างและด้วยเหตุนี้ข้อผิดพลาด
เมื่อฉันเชื่อมต่อกับ LTE ข้อผิดพลาดนั้นก็หายไป!