web-dev-qa-db-ja.com

iPhoneアプリで自己署名SSL証明書を使用する

長い間ご迷惑をおかけしましたことをお詫び申し上げます。自己署名SSL証明書に問題があり、これまでに試したすべてを文書化したい。

RESTサービスと通信するアプリに取り組んでいます。テストサーバーは、自己署名のssl証明書を使用しており、問題なくコンピューターにインストールできます。これは、必要な.p12ファイルです。インストールするパスワード。この証明書がインストールされていない場合、サーバーへのすべての要求は403を返します。

.p12は、「ルート認証局」、「ルート認証局」によって発行された「テストユーザー」証明書、および「テストユーザー」証明書に関連付けられた秘密鍵の3つのアイテムをキーチェーンにインストールします。

この証明書を自分のiPadに.p12ファイルを自分宛てにメールでインストールしました。添付ファイルをタップしてパスワードを入力すると、Safariでサイトにアクセスできるようになります。残念ながら、アプリケーションのサンドボックス化のため、これでアプリがRESTサービスと通信するのに十分ではありません。

RESTアプリからのサービスとのすべての通信にASIHTTPRequestを使用しています。各リクエストはASIHTTPRequestのサブクラスです。最初に実行する必要があるのは、[self setValidatesSecureCertificate:NO];を呼び出してサーバーへのSSL接続も試行しますが、それだけの場合は、サービスから403エラーコードが返されます。

証明書を使用するためのリクエストを取得する方法がわかりません。以下のコードを使用して、3つのアイテムを個別の.cerファイルとしてエクスポートし、プロジェクトに含めて、リクエストに追加してみました。

NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"cert" ofType:@"cer"]];
SecCertificateRef cert = SecCertificateCreateWithData(NULL, (CFDataRef)data);
...
[self setClientCertificates:[NSArray arrayWithObjects:(id)cert, ..., nil]];

このアプローチを使用するとコードは問題なく実行されますが、それでも403エラーが発生します。

アプリケーションに.p12ファイルを含め、同じコードを使用してインポートすることも試みました。 SecCertificateCreateWithDataはnilを返すため、これは失敗します。

ここで何をしているのか本当にわからない。これはすべて私の頭の上の部分であり、誰もが私に与えることができるどんな助けでも大いに感謝されるでしょう。

34
Jose Ibanez

わかりました。私は一種の間違った木を吠えていました。

私が見つけた最も重要な情報は、Appleのドキュメント Certificate、Key、and Trust Services Programming Guide 、特に「Tasks for iOS」ページにありました。これは、.p12ファイルからセキュリティIDを抽出する方法と、信頼例外を追加する方法を詳しく説明しています。

パズルの最後のピースは クライアント証明書サポート に関するASIHTTPRequestのドキュメントにありました。 p12ファイルから直接抽出したIDを使用することで、それをリクエストに渡し、すべてを適切に認証することができました。

これが、同様の機能を実装する必要のある他のすべての人に役立つことを願っています。

29
Jose Ibanez