2017-10-25 13 views
0

私のiOSアプリは、有効な証明書を持つバックエンドサーバーと通信します。開発中、私のiOSアプリケーションは、自己署名入りルート証明書で署名された証明書を持つ私の内部テストサーバと通信するように設定されています。テスト用にiOSシミュレータにカスタムCAルート証明書を自動的にインストールするにはどうすればよいですか?

iOSの11に先立ち、私はここにレイアウトされた手順を使用して、私の自己署名ルートによって署名された接続を信頼するように私のアプリを設定することができます:https://developer.apple.com/library/content/technotes/tn2232/_index.html#//apple_ref/doc/uid/DTS40012884-CH1-SECCUSTOMCERT

しかしiOSの11でそれは作成せずにATSを迂回するアプリのためにもはや可能ではありませんinfo.plistのATS例外です。このスレッドにはAppleの説明がいくつか含まれています:https://forums.developer.apple.com/thread/89694

iOSでは、どのように私のすべてのiOSシミュレータに自分のカスタムCAルートをインストールすることができますか?

答えて

2

iOS 11ではマルチアプリのUIテストがサポートされているため、iOSシステムでSafariと設定アプリを使用してカスタムCAのルートをインストールするUIテストを作成しました。 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で開くと、実際のデバイスで動作するようにできると思います。

このテストケースは、Xcodeサーバー上のBotとして実行することも、任意のシミュレータ上で実行してセットアップすることもできます。これは私が知っているハックです。

関連する問題