8

クライアント SSL 証明書を使用してバックエンド API と通信する際に、iOS 9 (2015 年 10 月 23 日時点のバージョン) でバグを発見したと思います。多くの REST サービスと同様に、API は 4xx エラー コードを生成してステータスを伝えます。それらの 1 つは、特定のクライアント ID がアクセスを許可されていないパスにクライアントがアクセスしようとした場合の 403 Forbidden エラーです。この HTTP エラーは、クライアント SSL 証明書が有効な接続をセットアップし、クライアント ID が認証された後に発生することに注意してください。

iOS 9 では、このシーケンスにより無効なクライアント SSL エラーが生成されます。

FAILED: Error Domain=NSURLErrorDomain Code=-1206 "The server “our.server.here” requires a client certificate."

(注: これは私のツイートのフォローアップです: https://twitter.com/ckmaresca/status/657576686318256128 - ほとんどの人がこれを検索する場所は SO だと思いました)

4

1 に答える 1

15

最終的に理解するのに数日かかりましたが、この特定のエラーは Apple の新しいアプリケーション トランスポート レイヤー セキュリティによって生成されたことが判明しました。具体的には、クライアント証明書を使用していて、バックエンド API が HTTP 403 エラーを生成した場合、ATL は証明書が不正であると判断し、トランザクション全体を強制終了するようです。

これは、リクエストが通過して適切に実行されたことをサーバー ログで確認できるためです。また、ソケットがリクエストを介して有効なままであり、このエラーがサーバーからのレスポンスを受信した後にのみ表示されることも確認しています。また、403 を返さないパスはエラーなしで機能し、HTTP エラー コードを 401 に変更するとこの問題が解消されるため、クライアント証明書が機能することもわかっています。

これは多くの理由で問題となりますが、主に HTTP エラーは SSL エラーではないためです。この 2 つは独立して動作することができ、有効なクライアント側 SSL 証明書で 403 エラーが発生する可能性は十分にあります....

回避策は、すべての 403 エラーを別のものに変更することです。多数の Oauth1/2 サーバーがさまざまな 403 エラーを生成することに注意してください。または、リバース プロキシを使用して HTTP 403 エラーを別の HTTP コードに再マッピングすることもできますが、これはテストしていません。

私たちは Apple にバグを報告しましたが、私たちが 1 週間行ったように頭を壁にぶつけるのを避けることができるように、人々に注意を促したかったのです....

これをデバッグしてくれたSherbit.ioエンジニアリング チーム (特に Varun & Matt) に感謝します。

于 2015-10-23T17:27:33.433 に答える