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之前沒有安裝過本地根證書的,安裝以後默認時不信任的。


推薦閱讀:

半年挺進行業前三,併入阿里的豌豆莢做對了什麼?

TAG:iOS應用 | 應用分發 | HTTPS |