Ошибка сертификата с Alamofire 4.0
Я пытаюсь использовать веб-сервисы для моего приложения для iOS через https. Веб-сервер использует самозаверяющий сертификат.
При использовании веб-службы я получаю сообщение об ошибке «Сертификат недействителен».
Сбой: Ошибка Domain = NSURLErrorDomain Code = -1202 «Сертификат для этого сервера недействителен. Возможно, вы подключаетесь к серверу, который притворяется« порталом », который может подвергнуть риску вашу конфиденциальную информацию».
Я знаю, что лучше всего исправить это на стороне сервера, чтобы включить доверенный корневой центр сертификации. Но поскольку это временная среда разработки, мы используем самозаверяющий сертификат. Так как это проблема ATS, я отредактировал ATS в моем info.plist, как показано ниже.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>devportal</key>
<dict>
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
</dict>
</plist>
Поскольку домены NSException не работают с IP-адресом и номером порта, я создал запись хоста в моем файле etc / hosts для IP-адреса веб-сервера и использую его какhttps: // devportal: 8443 / отдых / Логин вместо того, чтобы потреблять его какhttps://192.22.xx.xxx:8443/rest/login
Я следовал документации alamofire по политикам доверия сервера, редактировал ATS, чтобы разрешить домены исключений, но у меня ничего не получалось. Я потратил более 3 дней на эту проблему. Я что-то пропустил? Кто-нибудь сталкивался с подобной проблемой? Есть ли решение для этого? заранее спасибо
Я использую almofire 4.0, Xcode 8.0. Ниже мой код.
class LoginService{
private static var Manager: Alamofire.SessionManager = {
let pathToCert = Bundle.main.path(forResource: "192.22.xx.xxx", ofType: "crt") // Downloaded this certificate and have added to my bundle
let localCertificate:NSData = NSData(contentsOfFile: pathToCert!)!
// Create the server trust policies
let serverTrustPolicies: [String: ServerTrustPolicy] = [
"192.22.xx.xxx": .pinCertificates(
certificates: [SecCertificateCreateWithData(nil, localCertificate)!],
validateCertificateChain: true,
validateHost: true
),
"devportal:8443": .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
}()
/**
Calls the Login Web Service to authenticate the user
*/
public func login(username:String, password: String){
let parameters = [
"username": "TEST",
"password": "PASSWORD",
]
let header: HTTPHeaders = ["Accept": "application/json"]
LoginService.Manager.request("https://devportal:8443/rest/login", method: .post, parameters: parameters, encoding: JSONEncoding(options: []),headers :header).responseJSON { response in
debugPrint(response)
if let json = response.result.value {
print("JSON: \(json)")
}
}
}
}