web-dev-qa-db-ja.com

Alamofire 1.3を使用して自己署名サーバーに接続する方法

自己署名サーバーへの接続中に次のエラーが表示されます。

Error Domain = NSURLErrorDomain Code = -1202 "このサーバーの証明書は無効です。「maskeddomain.com」のふりをしているサーバーに接続している可能性があり、機密情報が危険にさらされる可能性があります。」 UserInfo = 0x7fb6dec259e0 {NSURLErrorFailingURLPeerTrustErrorKey =、NSLocalizedRecoverySuggestion =サーバーに接続しますか?、_kCFStreamErrorCodeKey = -9813、NSUnderlyingError = 0x7fb6dbe0dd90 "操作は完了できませんでした。

Alamofire 1.3( https://github.com/Alamofire/Alamofire#security )のように見えるため、この検証を無効にできます。誰かがこれを実装しましたか? SwiftプロジェクトでAlamofire APIを使用しています。正確に「サーバー信頼ポリシーマネージャー」を実装する必要がある場所がわかりません。アドバイスしてください。

18

Alamofireマネージャーの共有インスタンスのサーバー信頼ポリシーを変更する方法がありますが、お勧めしません。代わりに、マネージャの独自のカスタマイズされたインスタンスを作成する必要があります。推奨されるソリューションは次のとおりです。コードはSwift 2.0とAlamofireのSwift-2.0 branchXcode7 beta 5でコンパイルされています。

マネージャーのカスタマイズされたインスタンスの作成

Alamofireではrequestメソッドを使用せず、代わりにカスタムマネージャーで使用するため、マネージャーの保存場所を考える必要があります。私がしていることは、ネットワークラッパー(Alamofireを利用し、アプリケーションネットワーキングのニーズを処理するクラス)に静的として保存することです。私はこのように設定しました:

_private static var Manager : Alamofire.Manager = {
        // Create the server trust policies
        let serverTrustPolicies: [String: ServerTrustPolicy] = [
            "maskeddomain.com": .DisableEvaluation
        ]
        // Create custom manager
        let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
        configuration.HTTPAdditionalHeaders = Alamofire.Manager.defaultHTTPHeaders
        let man = Alamofire.Manager(
            configuration: NSURLSessionConfiguration.defaultSessionConfiguration(),
            serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
        )
        return man
    }()
_

次のステップは、Alamofire.request()を使用するすべての呼び出しをManager.request()に切り替えることです。したがって、次のようなものが必要です。

_Manager.request(.GET, "http://stackoverflow.com").responseJSON(
    completionHandler: { (_, respose, result) -> Void in
            if result.isSuccess {
                // enjoy your success
            } else if result.isFailure {
                // deal with your failure
            }
    })
_

とにかくマネージャーの共有インスタンスを変更したい場合、詳細については here を参照してください。

22
lawicko

SwiftまたはSwift 4およびAlamofire 4のマネージャー構成:

private static var manager: Alamofire.SessionManager = {

    // Create the server trust policies
    let serverTrustPolicies: [String: ServerTrustPolicy] = [
        "test.example.com": .disableEvaluation
    ]

    // Create custom manager
    let configuration = URLSessionConfiguration.default
    configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders
    let manager = Alamofire.SessionManager(
        configuration: URLSessionConfiguration.default,
        serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
    )

    return manager
}()
36
jonaszmclaren

[〜#〜] readme [〜#〜] に例が掲載されており、必要な場合に評価を無効にする方法を正確に示しています。

独自のManagerインスタンスも作成する必要があるため、次のようなことをする必要があります。

class NetworkManager {
    static let sharedInstance = NetworkManager()

    let defaultManager: Alamofire.Manager = {
        let serverTrustPolicies: [String: ServerTrustPolicy] = [
            "test.example.com": .PinCertificates(
                certificates: ServerTrustPolicy.certificatesInBundle(),
                validateCertificateChain: true,
                validateHost: true
            ),
            "insecure.expired-apis.com": .DisableEvaluation
        ]

        let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
        configuration.HTTPAdditionalHeaders = Alamofire.Manager.defaultHTTPHeaders

        return Alamofire.Manager(
            configuration: configuration,
            serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
        )
    }()
}

これにより、NetworkManager.sharedInstance.defaultManagerオブジェクト。

12
cnoon

私のプロジェクトの別のアプローチ。 ServerTrustPolicyManageropenクラスであり、serverTrustPolicy関数もopenです。そのため、オーバーライドできます。

// For Swift 3 and Alamofire 4.0
open class MyServerTrustPolicyManager: ServerTrustPolicyManager {

    // Override this function in order to trust any self-signed https
    open override func serverTrustPolicy(forHost Host: String) -> ServerTrustPolicy? {
        return ServerTrustPolicy.disableEvaluation

        // or, if `Host` contains substring, return `disableEvaluation`
        // Ex: Host contains `my_company.com`, then trust it.
    }
}

次に、

    let trustPolicies = MyServerTrustPolicyManager(policies: [:])
    let manager = Alamofire.SessionManager(configuration: sessionConfig, delegate: SessionDelegate(), serverTrustPolicyManager: trustPolicies)

2018年1月更新

ServerTrustPolicyManagerをトリガーするには、プロジェクトのInfo.plistを設定する必要があります。私は解決策を見つけました、詳細 この投稿で、2015年11月1日のcnoonのコメント

enter image description here

たとえば、site1.foo.comsite2.foo.com、...という名前のURLがある場合は、App Transport Security Settings-> Exception Domains-> foo.com辞書を追加し、次のエントリを追加します。 。

  • NSExceptionRequiresForwardSecrecy:いいえ
  • NSExceptionAllowsInsecureHTTPLoads:はい
  • NSIncludesSubdomains:はい

詳細は投稿を参照できます

5
AechoLiu

とにかく、@ cnoonの答えはほぼ一杯です。しかし、SSL検証の別のトラブルに遭遇したので、誰かがそれから助けを得ることができるなら、私は私のコードをここに置きたいと思っています。

private var manager: Manager?
// Import the certificates like xxx.cer to your project(anywhere will be fine), then the ServerTrustPolicy.certificatesInBundle() can find them
let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
            certificates: ServerTrustPolicy.certificatesInBundle(),
            validateCertificateChain: false,
            validateHost: true
        )
let serverTrustPolicies: [String : ServerTrustPolicy] = [
            "sub.server.com": .DisableEvaluation, // because the certificates only add the main domain, so disable evaluation for subdomain
            "192.168.0.2:8090": .DisableEvaluation, // the IP address for request data
            "www.server.com": serverTrustPolicy
        ]
manager = Manager(serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies))

次に、マネージャーを使用して要求します。

// this function in the class which for manager the Alamofire request
public func request(method: Alamofire.Method, _ URLString: URLStringConvertible,
                        parameters: [String : AnyObject]?) -> Alamofire.Request
    {
        // we do not need use Alamofire.request now, just use the manager you have initialized
        return manager!.request(method, URLString, parameters: parameters,
                                 headers: ["tokenId": UserManager_Inst.tokenID])
    }

p.s .: Swift 2.3サンプル

1
Raniys