2015-09-13 28 views
15

自己署名入り証明書を使用してhttps接続を介してサーバーと通信するには、Alamofireを使用します。私の環境はlocalhost上で動作します。私は、接続しようとしましたが、応答はすべての時間は次のようになります。私は、サーバー側の証明書を作成しました自己署名証明書付きのAlamofire/ServerTrustPolicy

import Foundation 
import UIKit 
import Alamofire 

class MessageView: UITableViewController { 

    let defaultManager: Alamofire.Manager = { 
     let serverTrustPolicies: [String: ServerTrustPolicy] = [ 
      "localhost": .DisableEvaluation 
     ] 

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

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

    override func viewDidLoad() { 
     super.viewDidLoad() 

     defaultManager 
      .request(.GET, "https://localhost:3443/message") 
      .responseJSON { _, _, result in 
       print("Success: \(result.isSuccess)") 
       print("Response String: \(result.value)") 
      } 
    } 

} 

:私は、次のコードでそれをやった

Success: false 
Response String: nil 

この行のbash:

openssl req -x509 -nodes -days 999 -newkey rsa:2048 -keyout server.key -out server.crt 

私は何が間違っているのか分かりません。ヘルプは素晴らしいだろう。

###アップデート###

ここでは、cURLの要求です。私の意見では、問題ないですか、間違っていますか?

curl -X GET https://localhost:3443/message -k -v 

* Trying ::1... 
* Connected to localhost (::1) port 3443 (#0) 
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 
* Server certificate: teawithfruit 
> GET /message HTTP/1.1 
> Host: localhost:3443 
> User-Agent: curl/7.43.0 
> Accept: */* 
> 
< HTTP/1.1 200 OK 
< Content-Type: application/json; charset=utf-8 
< Content-Length: 1073 
< Date: Tue, 15 Sep 2015 06:20:45 GMT 
< Connection: keep-alive 
< 
* Connection #0 to host localhost left intact 

[{"_id":"55f3ed2d81a334558241e2f4","email":"[email protected]","password":"abc","name":"teawithfruit","language":"en","__v":0,"timestamp":1442049325159,"messages":[{"_id":"55f40553e568236589772c61","user":"55f3ed2d81a334558241e2f4","language":"en","message":"hello world","__v":0,"timestamp":1442055507301,"id":"55f40553e568236589772c61"},{"_id":"55f48b2b02e7b059b54e99f6","user":"55f3ed2d81a334558241e2f4","language":"en","message":"hello world","__v":0,"timestamp":1442089771312,"id":"55f48b2b02e7b059b54e99f6"}],"id":"55f3ed2d81a334558241e2f4"}] 

###アップデート2 ###

後半に答えて申し訳ありません。

リクエストdebugPrint:

$ curl -i \ 
    -H "Accept-Language: en-US;q=1.0" \ 
    -H "Accept-Encoding: gzip;q=1.0,compress;q=0.5" \ 
    -H "User-Agent: Message/com.teawithfruit.Message (1; OS Version 9.0 (Build 13A340))" \ 
    "https://localhost:3443/message" 

結果debugPrint:

FAILURE: Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo={NSErrorFailingURLKey=https://localhost:3443/message, NSLocalizedDescription=cancelled, NSErrorFailingURLStringKey=https://localhost:3443/message} 

###ここUpdate 3の###

は完全なエラーです。ここ は2 debugPrintsですおそらくATSの問題でしょうか?

nil 
$ curl -i \ 
    -H "Accept-Language: en-US;q=1.0" \ 
    -H "Accept-Encoding: gzip;q=1.0,compress;q=0.5" \ 
    -H "User-Agent: Message/com.teawithfruit.Message (1; OS Version 9.0 (Build 13A340))" \ 
    "https://localhost:3443/message" 
2015-10-17 15:10:48.346 Message[25531:1001269] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802) 
FAILURE: Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x7fdc3044b740>, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, NSErrorPeerCertificateChainKey=<CFArray 0x7fdc2a7ca300 [0x10f7037b0]>{type = immutable, count = 1, values = (
    0 : <cert(0x7fdc31d31670) s: teawithfruit i: teawithfruit> 
)}, NSUnderlyingError=0x7fdc30064bd0 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=<SecTrustRef: 0x7fdc3044b740>, _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, kCFStreamPropertySSLPeerCertificates=<CFArray 0x7fdc2a7ca300 [0x10f7037b0]>{type = immutable, count = 1, values = (
    0 : <cert(0x7fdc31d31670) s: teawithfruit i: teawithfruit> 
)}}}, NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made., NSErrorFailingURLKey=https://localhost:3443/message, NSErrorFailingURLStringKey=https://localhost:3443/message, NSErrorClientCertificateStateKey=0} 
Success: false 
Response String: nil 
+0

を、あなたは成功したカールを使用して要求をすることができますか?はいの場合、 'result'に' debugPrint'と同様にcURLの例と出力を追加できますか? – cnoon

+0

投稿を更新しました。私は何の問題も見ることができません。あなたは? – teawithfruit

+0

'request'が' let request = defaultManager.request(...) 'のときに' debugPrint(request) 'の出力を投稿できますか? 'debugPrint(result)'の出力を投稿することもできますか?これらがなければ、手助けするのは難しいです。 – cnoon

答えて

12

あなたは、あなたのServerTrustPolicy辞書を作成するときにportドメインを追加する必要があります。

let defaultManager: Alamofire.Manager = { 
    let serverTrustPolicies: [String: ServerTrustPolicy] = [ 
     "localhost:3443": .DisableEvaluation 
    ] 

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

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

ありがとうございました。あなたが正しい。私はポートを追加するのを忘れた。しかし、私がポートを追加すると、次のエラーが出ます: 'Message [4401:95209] NSURLSession/NSURLConnection HTTPロードに失敗しました(kCFStreamErrorDomainSSL、-9802)' – teawithfruit

+0

別のアイデアはありますか? – teawithfruit

+0

これでATSを実行しているようです。詳細はこちら[こちら](https://forums.developer.apple.com/thread/13472)。新しいエラーの完全な詳細を質問のアップデートに投稿できますか? – cnoon

2

自己署名入りのhttpsのアプローチ。 ServerTrustPolicyManageropenクラスであり、serverTrustPolicyの機能もopenです。したがって、オーバーライドすることができます。

私の場合、サーバーリストは将来的に拡大します。 httpsリストをハードコードすると、新しいhttpsサーバーを追加するときにリストを維持する必要があります。だから、私は自分のニーズを満たすためにServerTrustPolicyManagerクラスをオーバーライドすることに決めました。その後

// 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 
    } 
} 

、SWIFT 4については

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

private static var Manager : Alamofire.SessionManager = { 
    // Create the server trust policies 
    let serverTrustPolicies: [String: ServerTrustPolicy] = [ 
     "your domain goes here": .disableEvaluation 
    ] 
    // Create custom manager 
    let configuration = URLSessionConfiguration.default 
    configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders 
    let man = Alamofire.SessionManager(
     configuration: URLSessionConfiguration.default, 
     serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies) 
    ) 
    return man 
}() 

その後、あなたはこのようにそれを呼び出す:

Manager.upload(body.data(using: .utf8)!, to: url, method: .post, headers: headers) 

Credits to Cnoon

1

私は時間が過ぎたことを知っていますが、まったく同じ問題がありました。そして私は上記の答えで解決策を見つけました。私はtrustPoliciesに2つの物事を追加する必要がありました:

Info.plistの中にも
let defaultManager: Alamofire.Manager = { 
    let serverTrustPolicies: [String: ServerTrustPolicy] = [ 
     // Here host with port (trustPolicy is my var where I pin my certificates) 
     "localhost:3443": trustPolicy 
     //Here without port 
     "localhost": .disableEvaluation 
    ] 

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

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

を追加する必要がありました:

<key>AppTransportSecurity</key> 
<dict> 
    <key>AllowsArbitraryLoads</key> 
     <true/> 
</dict>