[英]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.