1

変数マネージャー: AFHTTPSessionManager

init() {
    manager = AFHTTPSessionManager()
    manager.requestSerializer = AFJSONRequestSerializer()
    manager.responseSerializer = AFJSONResponseSerializer()

    let securityPolicy = AFSecurityPolicy(pinningMode: AFSSLPinningMode.Certificate)
    let certificatePath = NSBundle.mainBundle().pathForResource("c38acbe05a6328ee", ofType: "crt")!
    let certificateData = NSData(contentsOfFile: certificatePath)!

    securityPolicy.pinnedCertificates = [certificateData]
    securityPolicy.validatesDomainName = false
    securityPolicy.allowInvalidCertificates = false

    manager.securityPolicy = securityPolicy
}

私はこれをしばらくの間機能させようとしてきました。Swift のドキュメントは不足していますが、obj-c を読むのが上手になってきました。証明書はPEM形式です。私はそれを試し、.der形式に変換しました。Der 形式は init() で爆発し、.PEM 形式は evaluateServerTrust で爆発します。AFNetworking 2.5.1 で試し、3.0.4 にアップグレードしました - 同じ問題です。以下の true と false のすべての組み合わせを試しました。

securityPolicy.validatesDomainName = false securityPolicy.allowInvalidCertificates = false

どんな洞察も大歓迎です。ありがとうございました

4

1 に答える 1

0

多くの調査と試行錯誤の結果、Alamofire 3.0 に移行することにしましたが、解決策が見つかりました。次の点に注意してください。証明書は .der 形式である必要があります。私のは.pem形式でした。私の証明書は「葉」のものでした。つまり、証明書チェーンは含まれていませんでした。iOS 9.0 では、サーバーに ATS トランスポートを追加する必要がありました。

作業例:

var manager: Manager

init() {
    let serverTrustPolicies: [String: ServerTrustPolicy] = [
        "myserver.com": .PinCertificates(
            certificates: ServerTrustPolicy.certificatesInBundle(),
            validateCertificateChain: false,
            validateHost: true
        )
    ]

    manager = Alamofire.Manager(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(),
                                serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies))
}



let email = defaults.objectForKey("email") as? String
let beacon = defaults.objectForKey("beacon") as? String

let credential = NSURLCredential(user: email!, password: beacon!, persistence: NSURLCredentialPersistence.ForSession)

manager.request(.GET, url, encoding: .JSON)
.authenticate(usingCredential: credential)
.responseJSON { response in
    switch response.result {
    case .Success(let data):
        print(data)
        self.delegate?.didReceivePersonResults!(data as! NSDictionary)
    case .Failure(let error):
        print(error)
        self.delegate?.didReceivePersonError!("Server Error")
    }
}
于 2016-02-12T20:34:56.473 に答える