Objective-C/ココア:不正なサーバー証明書を受け入れるにはどうすればよいですか?
-
08-06-2019 - |
質問
使用する NSURLリクエスト, 証明書の有効期限が切れた Web サイトにアクセスしようとしています。リクエストを送信すると、 接続:didFailWithError デリゲート メソッドは、次の情報を使用して呼び出されます。
-1203, NSURLErrorDomain, bad server certificate
私の検索で見つかった解決策は 1 つだけです。NSURLRequest の隠しクラス メソッド:
[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:myHost];
ただし、明らかな理由から、運用アプリではプライベート API を使用したくありません。
何をすべきかについて何か提案はありますか?CFNetwork API を使用する必要がありますか? 使用する必要がある場合は、次の 2 つの質問があります。
- 始めるために使用できるサンプルコードはありますか?オンラインでは見つかりませんでした。
- これに CFNetwork を使用する場合、NSURL を完全に廃止する必要がありますか?
編集:
iPhone OS 3.0 では、これを行うためのサポートされる方法が導入されました。詳細はこちら: NSURLConnection を使用して信頼できない証明書の SSL に接続するにはどうすればよいですか?
解決 3
iPhone OS 3.0 では、下位レベルの CFNetwork API を必要としない、これを行うサポートされる方法が導入されました。詳細はこちら:
他のヒント
これを行うサポートされている方法では、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);
テスト目的の内部サーバーの場合は、テスト サーバーの証明書をキーチェーンにインポートしてカスタム信頼設定を設定してはどうでしょうか?
私も同じ問題に遭遇しました。SOAP クライアントを開発していましたが、開発サーバーには「自家製」証明書がありました。NSURL ではなく (文書化が不十分で放棄されたと思われる) WS メソッドを使用していたため、そのメソッドを使用しても問題を解決できませんでした。当面は (内部的に) 非 SSL を使用することにしました。繋がり。
ただし、そうは言っても、頭に浮かぶ疑問は、運用アプリでプライベート API を使用したくない場合、危険な証明書を持つサイトへのアクセスを許可する必要があるのかということです。
引用します イェンス・アルフケ:
これは理論上のセキュリティ上の問題だけではありません。何か
によると、パブリック DNS サーバーの 25% が侵害されています。
最近のレポート、さらにはユーザーをフィッシング/マルウェア/広告サイトに誘導する可能性もあります
ドメイン名を正しく入力した場合。あなたを守る唯一のもの
それが SSL 証明書のチェックです。
自己署名証明書を作成し、カスタム認証局を信頼できる CA に追加できますか?これが iPhone でどのように機能するかはよくわかりませんが、Mac OS X ではこれらをキーチェーンに追加すると思います。
この投稿にも興味があるかもしれません Re:NSURLDownload で不正な証明書エラーを処理する方法
もう 1 つのオプションは、代替接続ライブラリを使用することです。
私は AsyncSocket の大ファンで、自己署名証明書をサポートしています。
http://code.google.com/p/cocoaasyncsocket/
見てください。標準の NSURLRequest よりもはるかに堅牢だと思います。