11

NSURLRequestを使用して、期限切れの証明書を持つ Web サイトにアクセスしようとしています。リクエストを送信すると、connection:didFailWithErrorデリゲート メソッドが次の情報で呼び出されます。

-1203, NSURLErrorDomain, bad server certificate

私の検索では、NSURLRequest の隠しクラス メソッドという 1 つの解決策しか見つかりませんでした。

[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:myHost];

ただし、明らかな理由から、本番アプリでプライベート API を使用したくありません。

何をすべきかについて何か提案はありますか?CFNetwork API を使用する必要がありますか? もしそうなら、2 つの質問:

  • 開始するために使用できるサンプル コードはありますか? 私はオンラインで何も見つけていません。
  • これにCFNetworkを使用する場合、NSURLを完全に捨てる必要がありますか?

編集:

iPhone OS 3.0 では、これを行うためのサポートされている方法が導入されました。詳細はこちら: NSURLConnection を使用して、信頼されていない証明書の SSL に接続する方法は?

4

6 に答える 6

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);
于 2008-10-29T05:37:43.823 に答える
3

テスト目的の内部サーバー用である場合、テスト サーバーの証明書を KeyChain にインポートし、カスタムの信頼設定を設定してみませんか?

于 2008-10-18T20:22:44.903 に答える
2

iPhone OS 3.0 では、下位レベルの CFNetwork API を必要としない、これを行うためのサポートされている方法が導入されました。詳細はこちら:

NSURLConnection を使用して、信頼されていない証明書の SSL に接続する方法は?

于 2010-02-03T21:05:10.617 に答える
1

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

ただし、頭に浮かぶ質問は、本番アプリでプライベートAPIを使用したくない場合は、危険な証明書を使用してサイトへのアクセスを許可する必要があるかどうかです。

Jens Alfkeを引用します:

これは単なる理論上のセキュリティ問題ではありません。最近の報告
によると、パブリックDNSサーバーの25%が侵害されており 、ドメイン名を正しく入力した場合
でも、ユーザーをフィッシング/マルウェア/広告サイトに誘導する可能性があります。
それからあなたを守る唯一のもの
はSSL証明書チェックです。

于 2008-08-19T10:41:42.827 に答える
1

自己署名証明書を作成して、カスタム認証局を信頼できる CA に追加できますか? これが iPhone でどのように機能するかはよくわかりませんが、Mac OS X ではこれらをキーチェーンに追加すると思います。

この投稿にも興味があるかもしれませんRe: NSURLDownload で不正な証明書エラーを処理する方法

于 2008-08-21T16:42:46.350 に答える
0

別のオプションは、代替接続ライブラリを使用することです。

私はAsyncSocketの大ファンであり、自己署名証明書をサポートしています

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

見てください。標準のNSURLRequestsよりもはるかに堅牢だと思います。

于 2008-11-21T19:06:41.207 に答える