2008-08-18 18 views
8

NSURLRequestを使用して、期限切れの証明書を持つWebサイトにアクセスしようとしています。私はリクエストを送信すると、私の接続:didFailWithErrorデリゲートメソッドは、次の情報を使用して呼び出される:NSURLRequestの隠しクラスメソッド:Objective-C/Cocoa:不正なサーバー証明書を受け入れるにはどうすればよいですか?

[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:myHost]; 

-1203, NSURLErrorDomain, bad server certificate 

私の検索が一つの解決策をのみ上がってきました

しかし、明白な理由から私はプロダクションアプリでプライベートAPIを使用したくありません。

どうすればよいですか? CFNetwork APIを使用する必要がある場合は、次の2つの質問をお聞かせください。

  • 私はどのようなサンプルコードを使い始めることができますか?私はオンラインでは見つかりませんでした。
  • これにCFNetworkを使用する場合、NSURLを完全に削除する必要がありますか?

EDIT:

iPhone OS 3.0これを行うためのサポート方法を導入しました。詳細はこちらHow to use NSURLConnection to connect with SSL for an untrusted cert?

答えて

1

同じ問題が発生しました。私はSOAPクライアントを開発していましたが、devサーバーには「自家製」証明書があります。私はNSURLを使用していなかったので、その方法を使用しても問題を解決することができませんでしたが(文書化されていない、明らかに放棄された)WSメソッドは、(内部的に)非SSL接続。

しかし、プロダクションアプリでプライベートAPIを使用するつもりがない場合は、疑わしい証明書を持つサイトにアクセスできるようにする必要があるとのことですが、

私はJens Alfkeを引用します:

ちょうど理論的なセキュリティ上の問題ではない

。何か

最近のレポートによると、パブリックDNSサーバーの25%が侵害されており、ユーザーがフィッシング/マルウェア/広告サイトにユーザーを誘導することさえあります。
ドメイン名を正しく入力すると。あなたを守るのは
からSSL証明書のチェックだけです。

+0

問題のサイトはアクセス可能内部、私たちのテスト環境です。私は、ネットワーク管理者があまりにも安すぎたり、あまりにも怠けて、それに対して有効な証明書を保持していないと思う。私たちの生産環境はもちろん、有効な証明書を持っています。この証明書回避機能は本番環境では有効化されていないため、テストのためだけにプライベートAPIを使用できます。プライベートAPIがヤンクされていれば正方形に戻ってしまうので、私はまだそれを「正しい」方法でやりたいと思うだろう。 –

1

自己署名証明書を作成し、カスタム認証局を信頼できるCAに追加できますか?私はこれがiPhone上でどのように動作するのかはよく分かっていませんが、Mac OS XではこれらをKeychainに追加すると仮定します。

また、それはテスト目的のために内部サーバのためなら、なぜ単にキーチェーンにテストサーバーの証明書をインポートして、カスタムの信頼設定を設定していないRe: How to handle bad certificate error in NSURLDownload

3

この記事に興味がある可能性があり?

8

これを行うには、CFNetworkを使用する必要があります。あなたは、kCFStreamSSLValidatesCertificateChain == kCFBooleanFalseを指定するストリームにkCFStreamPropertySSLSettingsを添付する必要があります。以下はクイックコードですが、有効な結果を確認してクリーンアップを行いません。これを済ませたら、CFReadStreamRead()を使ってデータを取得できます。

CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, CFSTR("http://www.apple.com"), NULL); 
CFHTTPMessageRef myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, CFSTR("GET"), myURL, kCFHTTPVersion1_1); 
CFReadStreamRef myStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, myRequest); 
CFMutableDictionaryRef myDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); 
CFDictionarySetValue(myDict, kCFStreamSSLValidatesCertificateChain, kCFBooleanFalse); 
CFReadStreamSetProperty(myStream, kCFStreamPropertySSLSettings, myDict);  
CFReadStreamOpen(myStream); 
0

別のオプションは、代替接続ライブラリを使用することです。私はAsyncSocketの大ファンだし、それが自己署名certsのためのサポート

http://code.google.com/p/cocoaasyncsocket/

を見てみましょう持っ

、私はそれは、その後、標準的な方法NSURLRequestsより堅牢だと思います。

関連する問題