これはSwiftを使用した私の最初のプロジェクトです。私はAPIを接続するためにalamofireを使用しています。デバッグに使用したいAPIからローカルコピーを持っているので、テストデータを設定できます。これは、リモートAPIに、いじることができない実際のデータがすでに含まれているためです。
問題は、https://localhost:8443/MyProject
にアクセスしようとすると、以下のエラーが発生することです。
オプション(エラードメイン= NSURLErrorDomainコード= -1202 "このサーバーの証明書は無効です。機密情報を危険にさらす可能性のある「localhost」のふりをしているサーバーに接続している可能性があります。" UserInfo = 0x7fbeb8c61ff0 {NSURLErrorFailingURLPeerTrustErrorKey = 、NSLocalizedRecoverySuggestion =とにかくサーバーに接続しますか?、_ kCFStreamErrorCodeKey = -9813、NSUnderlyingError = 0x7fbeb8ea5c00 "操作を完了できませんでした。(kCFErrorDomainCFNetworkエラー-1202。)"、NSLocalizedDescription =このサーバーの証明書が無効です。機密情報を危険にさらす可能性のある「localhost」のふりをしているサーバーに接続している可能性があります。、NSErrorFailingURLKey = https:// localhost:8443/myproject/api/loginUser.pdo 、 NSErrorFailingURLStringKey = https:// localhost:8443/myproject/api/loginUser.pdo 、_ kCFStreamErrorDomainKey = 3})
setAllowsAnyHTTPSCertificate
を使用するか、Connectionのデリゲートを使用するなど、Objective-cの多くの解決策を見つけました。しかし、SwiftでsetAllowsAnyHTTPSCertificate
の適切なメソッドを見つけることができず、alamofireの使用中にデリゲートを接続に設定する方法がわかりません。私がする必要があるアイデアはありますか?
setAllowsAnyHTTPSCertificate
はプライベートAPIであり、プロジェクトがAppleによって拒否されることを知っています。デバッグ中にのみ使用したいので、プロジェクトを公開する前に削除されます。前もって感謝します。
SessionDelegate
オーバーライドクロージャを使用して、Alamofireのデフォルトのチャレンジ動作を簡単にオーバーライドできます。 Alamofireに無効な証明書の受け入れを許可する方法の例を次に示します。
重要:これを本番コードで使用しないでください。セキュリティは非常に重要であり、この実装はAlamofireのセキュリティメカニズムを完全に無視します。自己責任!
let manager = Alamofire.Manager.sharedInstance
manager.delegate.sessionDidReceiveChallenge = { session, challenge in
var disposition: NSURLSessionAuthChallengeDisposition = .PerformDefaultHandling
var credential: NSURLCredential?
if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {
disposition = NSURLSessionAuthChallengeDisposition.UseCredential
credential = NSURLCredential(forTrust: challenge.protectionSpace.serverTrust)
} else {
if challenge.previousFailureCount > 0 {
disposition = .CancelAuthenticationChallenge
} else {
credential = manager.session.configuration.URLCredentialStorage?.defaultCredentialForProtectionSpace(challenge.protectionSpace)
if credential != nil {
disposition = .UseCredential
}
}
}
return (disposition, credential)
}
私たち( Alamofire TC )は、 Alamofire 1.3. リリースでTLSピン留めとセキュリティに関連する他のいくつかの機能を実装する予定です。
Alamofire 1.3.0リリースがリリースされ、サーバーの信頼認証の課題をカスタマイズするためのサポートが大幅に強化されました。詳細については、READMEの Security セクションを確認してください。
@cnoonのコードのSwift3バージョン
manager.delegate.sessionDidReceiveChallenge = { session, challenge in
var disposition: URLSession.AuthChallengeDisposition = .performDefaultHandling
var credential: URLCredential?
if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust, let trust = challenge.protectionSpace.serverTrust {
disposition = URLSession.AuthChallengeDisposition.useCredential
credential = URLCredential(trust: trust)
} else {
if challenge.previousFailureCount > 0 {
disposition = .cancelAuthenticationChallenge
} else {
credential = self.manager.session.configuration.urlCredentialStorage?.defaultCredential(for: challenge.protectionSpace)
if credential != nil {
disposition = .useCredential
}
}
}
return (disposition, credential)
}
Swift
私の場合、swaggerクライアントライブラリを使用するときは、次のようにローカルサーバーをテストするようにコードを変更しました。
open func createSessionManager() -> Alamofire.SessionManager {
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = buildHeaders()
let serverTrustPolicies: [String: ServerTrustPolicy] = ["localhost": .disableEvaluation]
return Alamofire.SessionManager(configuration: configuration, serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies))
}