iOS10.3自簽名HTTPS網路無法連接問題解析
起因
因為iOS應用安裝(itms-services://?action=download-manifest)在iOS7.0以後必須使用HTTPS進行,所以本地搭建的網頁一般使用自簽名證書。之前都是直接安裝自簽名根證書後就可以安裝iOS應用,但是在iOS 10.3的設備上,點擊網頁上的安裝鏈接後,會彈出"無法連接到<鏈接名稱>"
通過Xcode日誌可以看到以下錯誤:
itunesstored(Security)[106] <Notice>: [root AnchorTrusted]itunesstored(CFNetwork)[106] <Notice>: TIC TLS Trust Result [27:0x119f686b0]: 2itunesstored(CFNetwork)[106] <Error>: TIC SSL Trust Error [27:0x119f686b0]: 3:0itunesstored(CFNetwork)[106] <Notice>: TIC TCP Conn Cancel [27:0x119f686b0]itunesstored(CFNetwork)[106] <Notice>: TIC TCP Conn Destroyed [27:0x119f686b0]itunesstored(libsystem_network.dylib)[106] <Error>: nw_coretls_callback_handshake_message_block_invoke_3 tls_handshake_continue: [-9812]itunesstored(CFNetwork)[106] <Notice>: NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)itunesstored(CFNetwork)[106] <Error>: HTTP load failed (error code: -1202 [3:-9813])itunesstored(CFNetwork)[106] <Error>: NSURLSessionTask finished with error - code: -1202itunesstored[106] <Notice>: LoadExternalDownloadManifestOperation: Request failed with error: <private>itunesstored[106] <Error>: Could not load download manifest with underlying error: <private
分析
從日誌可以看到-1202的CFNetwork錯誤,從CFNetwork/CFNetworkErrors.h文件可知,是kCFURLErrorServerCertificateUntrusted的錯誤。也就是說,我們之前安裝的證書沒有被系統信任。這是為什麼呢?
嗯,在折騰了各種辦法後,發現原來是蘋果的鍋。
從iOS 10.3開始,蘋果修改了手動安裝證書的信任方式:
在 iOS 10.3 及更高版本中,手動安裝包含證書有效負載的描述文件時,這個證書不會自動受 SSL 信任。
當安裝通過電子郵件發送或從網站下載的描述文件時,您必須手動開啟受 SSL 信任。
要為這個證書開啟受 SSL 信任,請前往「設置」>「通用」>「關於本機」>「證書信任設置」。在「針對根證書啟用完全信任」下,開啟信任這個證書。
而且就我試驗的結果,有這樣的現象:
在iOS 10.3之前沒有上述設置;如果在iOS 10.3 之前安裝過本地根證書使用沒問題的,升級到10.3也沒有問題。只有iOS 10.3之前沒有安裝過本地根證書的,安裝以後默認時不信任的。
推薦閱讀: