2013-05-17 5 views
15

私のアプリでは、自分のクライアントとサーバー間の接続を保護するためにhttpsと自己署名入りのSSL証明書を使用しています。AFNetworkingによるSSLピンニング

AFNetworkingライブラリに、アプリケーションにバンドルされている証明書のコピーに対してSSLピンニングを実行しようとしていました。

#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ =1 
#define _AFNETWORKING_PIN_SSL_CERTIFICATES_ =1 

そして、私のAFJSONRequestOperationstartを呼び出す前に、私はAFSSLPinningModeCertificateSSLPinningModeプロパティを設定します:私は両方を定義しAFURLConnectionOperationヘッダで

しかし、私は次のエラー得続けるJSONリクエストを実行しようとすると:私はSSLピンニングが.cerの証明書ではなく、私の自己ホストOSのXのWebサーバで動作することを読んAFURLConnectionOperationヘッダで

Error Domain=NSURLErrorDomain Code=-1012 "The operation couldn’t be completed. 
(NSURLErrorDomain error -1012.)" UserInfo=0x758f120 
{NSErrorFailingURLKey=https://mydomain.com, 
NSErrorFailingURLStringKey=https://mydomain.com} 

を私は.crt証明書を持っています。

これが問題ですか? .crtでAFNetworkingを動作させる方法はありますか?

私の.crtを.cerに変換し、それを私のアプリケーションにバンドルしようとしましたが、同じエラーが表示されます。 .crtファイルをサーバー側でも新しく作成した.cerと切り替えるべきですか?

+0

次のコマンドを使用することができますか?それを共有するのを忘れないでください。 – jAckOdE

+0

私は 'AFNetworking'をあきらめて、標準の' NSURLConnection'を利用してクラスを作成しました(接続自体の代理人として働きます)。要求を行うために、 ' - (void) connection:NSURLConnection *)接続willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge'メソッドは、NSURLConnectionDelegate'プロトコルの一部です。コードを見たい場合は、お気軽にお問い合わせください。 – BigLex

+0

私はそれを自分で試していません。しかし、AFNetworkingのサンプルプロジェクト。 SSLピン設定モードは、AFSSLPinningModeCertificateではなく、AFSSLPinningModePublicKeyに設定されます。あなたはそれを試しましたか? – jAckOdE

答えて

20

私はそれを働かせました。

私は自分のiOSアプリケーションから自分のサーバーAPIをヒットするための自己署名証明書を作成していました。 私はOpenSSLで証明書を作成しました。私はそれを作成したとき、私はいくつかのファイルを持っていました。そのうちの1つは "server.crt"でした。最初は、「server.cer」に名前を変更し、AFURLConnectionOperationオブジェクトに「AFSSLPinningModeCertificate」を使用しました。それはうまくいかず、私はこの例で "AFSSLPinningModePublicKey"を使用していることに気付きました。

私は自分のファイル(名前が変更された ".crt"ファイル)を彼と比較しました。
私は「をserver.crt」はbase64エンコードしたことに気づいており、このように:

-----BEGIN CERTIFICATE----- 
394230AFDFD... 
-----END CERTIFICATE----- 

私は彼が使用しています「adn.cer」ファイルは、base64でエンコードされていないことをAFNetworkingでMatttの例から気づきました。生のバイトだけです。私はAFSSLPinningModePublicKeyに私のAFURLConnectionOperationを設定

$ base64 -D -i ./server.crt -o ./server.cer 

: だから、私はこれをしませんでした。
私はそれをプロジェクトに戻し、私のiOSプロジェクトのクリーンなビルドを行い、すべてうまくいった。

これが役立ちますように!

Btwの場合、Xcodeは「.crt」キーまたは「.cer」キーの情報をbase64でも生のものでも表示しますので、混乱させないでください。いずれの場合でも証明書データを見ることができるはずです。AFは生の(非base64)ものだけを受け入れることになります。

UPDATE:
BASE64で問題を抱えて誰でも、この何がOpenSSLを使用してOS X上で私の作品:

$ openssl base64 -d -in ./server.crt -out ./server.cer 
+1

あなたの回避策は正しいものですが、作成する方法それは.cerファイルなしで動作しますか?これが問題です! –

+8

参考までに、変換を行うためにbase64を使用する際に問題が発生しました。代わりに、私は 'openssl x509 -in test.crt -outform der-out test.cer'を使用しました。 – CharlesA

+0

.cerについて誰かが混乱している| .crtなど、そこには[いい投稿](http://www.gtopia.org/blog/2010/02/der-vs-crt-vs-cer-vs-pem-certificates/)があります。確かにあなたの疑いを明らかにする。 証明書をさまざまな形式に変換する方法も示します。 – nefarianblack

3

あなたはAFNetworking 2.xのを使用している、とあなたは使用している場合

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey]; 
securityPolicy.validatesCertificateChain = NO; 

またはあなたがで証明書チェーン全体でそれをすべて渡すことができます:正しい.cerのが、まだあなたの呼び出しでエラーコード-1012を受け、あなたはvalidatesCertificateChain無効にする必要があります。

0

証明書の拡張子はcer not crtであり、.der形式である必要があります。出力ファイルをXcodeプロジェクトに追加します。あなたは答えを見つけるか

openssl x509 -in your.crt -out certificate_cer.cer -outform der

関連する問題