簡體   English   中英

如何在我的iOS模擬器上自動安裝自定義CA根證書以進行測試?

[英]How can I automatically install a custom CA root certificate on my iOS simulators for testing?

我的iOS應用程序與具有有效證書的后端服務器通信。 在開發過程中,我的iOS應用被配置為與內部測試服務器通信,該服務器具有由我的自簽名根證書簽名的證書。

在iOS 11之前,我可以配置我的應用程序,使其信任我的自簽名根使用以下此處列出的說明進行簽名的連接: https : //developer.apple.com/library/content/technotes/tn2232/_index.html#//apple_ref/ doc / uid / DTS40012884-CH1-SECCUSTOMCERT

但是,在iOS 11中,如果不再在info.plist中創建ATS異常,則應用程序就無法繞過ATS。 該線程包括來自Apple的一些解釋: https : //forums.developer.apple.com/thread/89694

因此,現在在iOS中,如何以某種自動化方式在所有iOS模擬器上安裝自定義CA根?

由於iOS 11支持多應用程序UI測試,因此我創建了一個UI測試,該測試使iOS系統使用Safari和“設置”應用程序安裝自定義CA的根目錄。 UI測試的來源如下:

import XCTest

class InstallRootCerts: XCTestCase {

    override func setUp() {
        super.setUp()
        continueAfterFailure = false
        XCUIApplication().launch()
    }

    override func tearDown() {
        super.tearDown()
    }

    func testInstallTestingRootCertOnDevice() {

        // Set test time env var ROOT_CA to point to your custom CA's .cer file.
        let cert = ProcessInfo.processInfo.environment["ROOT_CA"]
        // Set test time env var ROOT_CA_NAME to contain the name of your CA.
        let caName = ProcessInfo.processInfo.environment["ROOT_CA_NAME"]

        let safari = XCUIApplication(bundleIdentifier: "com.apple.mobilesafari")

        let settings = XCUIApplication(bundleIdentifier: "com.apple.Preferences")

        safari.activate()

        XCTAssertNotNil(cert)

        let certUrl = "file://\(cert!)"

        if safari.otherElements["URL"].exists {
            safari.otherElements["URL"].tap()
        }

        let addressBar = safari.textFields["URL"]

        addressBar.typeText(certUrl)

        safari.buttons["Go"].tap()

        safari.buttons["Allow"].tap()

        XCTAssertTrue( settings.wait(for: .runningForeground, timeout: 30) )

        if !settings.staticTexts["Verified"].exists {
            settings.buttons["Install"].tap()
            settings.buttons["Install"].tap()
            settings.sheets.buttons["Install"].tap()
        }

        // Now trust the root certificate
        settings.buttons["Cancel"].tap()
        XCTAssertTrue( safari.wait(for: .runningForeground, timeout: 120) )
        settings.activate()
        XCTAssertTrue( settings.wait(for: .runningForeground, timeout: 120) )

        settings.buttons["General"].tap()
        settings.cells["About"].tap()
        settings.cells["Certificate Trust Settings"].tap()
        let cell = settings.cells.containing(.staticText, identifier: caName)
        let toggle = cell.switches.firstMatch
        if toggle.value as? String != "1" {
            toggle.tap()
            settings.buttons["Continue"].tap()
        }

    }

}

該測試用例僅適用於運行iOS 11.0的模擬器。 我認為,如果將.cer文件放在Web服務器上並通過http打開它,則可以與實際設備一起使用。

然后,可以將該測試用例作為Bot在Xcode服務器上運行,也可以在本地的任何模擬器上運行以進行設置。 我知道這是黑客。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM