首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在iOS模拟器上自动安装自定义CA根证书以进行测试?

如何在iOS模拟器上自动安装自定义CA根证书以进行测试?
EN

Stack Overflow用户
提问于 2017-10-25 19:45:00
回答 1查看 929关注 0票数 0

我的iOS应用程序与拥有有效证书的后端服务器进行通信。在开发过程中,我的iOS应用程序被配置为与我的内部测试服务器通信,该服务器有一个由我自己签名的根证书签名的证书。

在使用iOS 11之前,我可以将我的应用程序配置为信任由我自己签名的根签名的连接,使用下面列出的说明:ref/doc/uid/DTS40012884-CH1-SECCUSTOMCERT

然而,在iOS 11中,应用程序不再可能绕过ATS而在info.plist中创建ATS异常。这个线程包含了苹果公司的一些解释:https://forums.developer.apple.com/thread/89694

那么,在iOS中,如何以某种自动化的方式在所有iOS模拟器上安装我的自定义CA根呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-25 19:45:00

由于iOS 11支持多应用程序UI测试,所以我创建了一个UI测试,使iOS系统使用Safari和Settings应用程序安装自定义CA的根。UI测试的来源如下:

代码语言:javascript
复制
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上打开它,则可以使它与实际设备一起工作。

然后,可以在Xcode服务器上以Bot的形式运行此测试用例,也可以在本地的任何模拟器上运行该测试用例来设置它。我知道这是个黑客。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46940888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档