https を使用してサーバーと通信する iOS Enterprise POS アプリに取り組んでいます。iOS7 GM での SSL エラーの受信を見てきました- "AddTrust External CA Root" is not trusted? および自己署名 CA と自己署名証明書の違いおよび一般的に Web を精査しましたが、どこにも行きません。
アプリは、http または https プロトコルを使用して iOS6.1 で正常に動作します。また、iOS 7GM では http 経由では正常に動作しますが、https 経由では機能しません。サーバーに送信する最初のメッセージで失敗します。アプリ側では、次の認証チャレンジを処理します。
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge
{
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]
forAuthenticationChallenge:challenge];
}
その後、コールバックを取得します:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
いいえ:
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
これは、クライアントとサーバーが接続のネゴシエーションに成功し、暗号化プロトコルに同意したことなどを意味すると思います。残念ながら、(ネットワーク スタックに関する限り) 成功したように見えますが、AMF ペイロードに 0 バイトのデータが返されます。
ここが興味深い部分です。サーバー側 (JBoss4.2.3) では、AMFRequest を含む httpRequest 本体をブレークポイントして調べることができます。http では、本文に常に 384 バイトが含まれます。https 経由で、クライアントが iOS 6.1 の場合は 384 バイトを取得しますが、クライアントが iOS 7 の場合は 0 バイトを取得します。https 要求はサーバーによって「正常に」受け入れられ、エラーやセキュリティ違反などは発生しなかったと解釈します。
もう1つのデータポイント。クライアント側でCharlesを実行すると、iOS 7シミュレーターを使用してhttps経由ですべてが正しく機能します。私の 384 バイトの AMFRequest は、Charles とサーバーの両方で問題なく表示されます。Charles は http プロキシとして機能しますが、アプリはそれについて何も知りません。Charles の証明書をインストールしたので、SSL 経由でサーバーと通信していると思います (よくわかりません)。
助けや提案をありがとう。
更新: Apple が推奨するアプローチを実装しました。
- (void)connection: (NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
traceMethod();
SecTrustRef trust = challenge.protectionSpace.serverTrust;
NSURLCredential *credential = [NSURLCredential credentialForTrust: trust];
[challenge.sender useCredential: credential
forAuthenticationChallenge: challenge];
}
しかし、古い (iOS 5 より前の) 方法とまったく同じ結果が得られます。