自己署名サーバーへの接続中に次のエラーが表示されます。
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を使用しています。正確に「サーバー信頼ポリシーマネージャー」を実装する必要がある場所がわかりません。アドバイスしてください。
Alamofireマネージャーの共有インスタンスのサーバー信頼ポリシーを変更する方法がありますが、お勧めしません。代わりに、マネージャの独自のカスタマイズされたインスタンスを作成する必要があります。推奨されるソリューションは次のとおりです。コードはSwift 2.0とAlamofireのSwift-2.0 branch、Xcode7 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 を参照してください。
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
}()
[〜#〜] 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
オブジェクト。
私のプロジェクトの別のアプローチ。 ServerTrustPolicyManager
はopen
クラスであり、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)
ServerTrustPolicyManager
をトリガーするには、プロジェクトのInfo.plist
を設定する必要があります。私は解決策を見つけました、詳細 この投稿で、2015年11月1日のcnoonのコメント 。
たとえば、site1.foo.com
、site2.foo.com
、...という名前のURLがある場合は、App Transport Security Settings
-> Exception Domains
-> foo.com
辞書を追加し、次のエントリを追加します。 。
とにかく、@ 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サンプル