2017-12-30 66 views
0

自己署名証明書付きのHTTP RESTサーバーがあります。私はalamofireを使って、iOS Swiftアプリからこのサーバと話したいと思います。私が持っている現在のコードは次のとおりです。私はHTTP呼び出しAlmgr.requestを作るしようとすると、上記のコードでは自己署名ローカル証明書のalamofire SSLエラー

`` `

let Almgr : Alamofire.SessionManager = { 
    // Create the server trust policies 
    let serverTrustPolicies: [String: ServerTrustPolicy] = [ 
     "localhost": .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 
}() 

Almgr.request(url, method: .post, parameters: params).responseJSON { 
      response in 

      if response.result.isSuccess { 
       print("Success") 
      } else { 
       print("Failure") 
      } 
     } 

、私は常にエラーを取得しています。エラーメッセージは次のとおりです。

2017-12-30 18:24:20.114486+0530 myApp[58036:2721102] ATS failed system trust 
2017-12-30 18:24:20.114625+0530 myApp[58036:2721102] System Trust failed for [1:0x600000178a80] 
2017-12-30 18:24:20.114814+0530 myApp[58036:2721102] TIC SSL Trust Error [1:0x600000178a80]: 3:0 
2017-12-30 18:24:20.115142+0530 myApp[58036:2721102] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802) 
2017-12-30 18:24:20.115274+0530 myApp[58036:2721102] Task <4E3D9E88-B9CE-48C4-850C-5A3E7C9A6A72>.<1> HTTP load failed (error code: -1200 [3:-9802]) 
2017-12-30 18:24:20.115469+0530 myApp[58036:2721231] Task <4E3D9E88-B9CE-48C4-850C-5A3E7C9A6A72>.<1> finished with error - code: -1200 

これを解決する方法はありますか?私は、もしURLがポート8000​​のlocalhostであれば、何のチェックもしたくありません。私はserverTrustPoliciesの定義にポートを追加しようとしましたが、それは何の違いもなく、まだエラーが出ます。どんな助け?

更新:私の問題はhttps://developer.apple.com/library/content/qa/qa1948/_index.htmlと関連していますが、まだ修正する方法が見つかっていません。

+0

'ServerTrustPolicyManager'のカスタムクラスを作成しようとしていますか? –

+0

あなたは精緻化できますか?私はあなたが何を意味するのか理解できません。 –

答えて

0

私は解決策を考え出しました。 iOSのがhttpsエラーなしでローカルネットワークを許可できるように

<key>NSAppTransportSecurity</key> 
<dict> 
     <key>NSAllowsLocalNetworking</key> 
     <true/> 
</dict> 

:私たちは、Info.plistファイルを編集し、次のセクションを追加する必要があります。

0

1.

ポートを提供する際に、サーバーの信頼ポリシーを変更するあなたのアプローチが動作するはずです。また、this postを参照してください。たぶんあなたは、シミュレータであなたのアプリをテストしていると同じマシン上のWebサーバーに接続しようとしている?これは、あらゆる種類の接続の問題を引き起こす可能性があります(なぜ、どうしてlocalhostに接続しようとしていますか?)。

2.あなたがNSAllowsLocalNetworkingまたは類似のパラメータを設定することはありません必要があります。 SSLを破ると、ローカルネットワークでも何が起きるかわからないことがあります。絶対に必要な場合は、上記のように単一のホストとポートに対して例外を作成するだけです。これはまた、SSLを壊すので、あなたが自己署名証明書を使用しないでください

3.

Let's Encryptを使用して有効な証明書を取得するのは非常に簡単です。ただし、場合によっては、有効な証明書を取得できない場合もあります。独自の認証局を作成し、CAルート証明書をデバイスにエクスポートする必要があります。このようにして、特定のホストに対してのみ例外を作成します。

すべてのアプリケーションでセキュリティが重要であることに注意してください。あなたがしていることを正確に知っている場合にのみ、例外を作成してください。

+0

> 1 それはもう動作しません(速い4.0とMac OS 10.13.2 atleastで)。これは私の現地での開発であり、生産ではありません。 > 2 NSAllowsLocalNetworkingを設定すると、SSLの厳密性がローカルホストアクセスのみで緩和され、他のサーバーでは使用できません。 > 3 letsencryptを使用してlocalhostの証明書を取得できません。私のラップトップのローカル開発に集中したいのであれば、新しいCAの作成は複雑すぎるでしょう。 NSAllowsLocalNetworkingを設定することによって私が見逃している潜在的な脆弱性はありますか?私はそのようなドキュメントを読んでそのようなものを見つけることができません。私は何かが恋しいですか?ありがとう。 –

+0

1: "localhost"の代わりにIPアドレスを使用しようとしましたか?シミュレータの代わりに外部デバイスを使用しようとしましたか? – sundance

+0

2:暗号化されていないネットワーク通信は、すべての場合で回避する必要があります。 3:有効な証明書には静的IPアドレスが必要です。 – sundance

0

私は同じ問題に直面していました。私が考え出したものとは何か:

let almgr:Alamofire.SessionManager = { 
    //getcertificates is my own method where i create certificate with data from my .cer file 
    let certificates = getCertificates() 
    let trustPolicy = ServerTrustPolicy.pinCertificates(certificates: certificates, validateCertificateChain: true, validateHost: true) 

// Here was the problem. I had to modify that dict: (localhost with port and with .disableEvaluation) 
    let serverTrustPolicies = ["liper:8000":trustPolicy, "liper":.disableEvaluation] 
    let serverTrustPolicyManager = ServerTrustPolicyManager(policies: serverTrustPolicies) 

    let configuration = URLSessionConfiguration.default 
    configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders 
    let man = Alamofire.SessionManager(configuration: URLSessionConfiguration.default, serverTrustPolicyManager: serverTrustPolicyManager) 
    return man 
}() 
関連する問題