2012-09-23 31 views
63

私は、Windows 8アプリケーションがSSL経由でテスト用Web APIと通信するのを苦労しています。HttpClientで信頼されていないSSL証明書を許可する

HttpClient/HttpClientHandlerはWebRequestのような信頼できない証明書を無視するオプションを提供していないと思われますが(ServerCertificateValidationCallbackで「ハッキー」ではありますが)

ご協力いただければ幸いです。

+0

.NETコアを使用している場合は、[こちら](https://stackoverflow.com/a/44540071/5549643)の回答に興味があります。 – kdaveid

答えて

11

Windows 8.1では、無効なSSL証明書を信頼できるようになりました。 Windows.Web.HttpClientを使用するか、System.Net.Httpを使用する必要があります。 http://www.nuget.org/packages/WinRtHttpClientHandler

ドキュメントはGitHubの上にある: https://github.com/onovotny/WinRtHttpClientHandler

+4

すべてのコードを使用せずにこれを行う方法はありますか?つまり、あなたのソリューションの要点は何ですか? – wensveen

+0

解決策の要点は、Windowsのhttpクライアントハンドラをラップし、それをHttpClientの実装として使用することです。このファイルはすべてこのファイルに含まれています:https://github.com/onovotny/WinRtHttpClientHandler/blob/master/WinRtHttpClientHandler/WinRtHttpClientHandler.csは自由にコピーできますが、単にパッケージを使用するだけではわかりません。 –

57

WebRequestHandler ClassとそのServerCertificateValidationCallback Propertyを見てください:

using (var handler = new WebRequestHandler()) 
{ 
    handler.ServerCertificateValidationCallback = ... 

    using (var client = new HttpClient(handler)) 
    { 
     ... 
    } 
} 
+4

回答に感謝しますが、私は既にそれを検討しました.Windows 8 Storeアプリケーションの.NETには存在しません。 – Jamie

+0

ただし、独自のHttpClientHandlerまたはHttpMessageHandler派生クラスを作成することは簡単です。特に、WebRequestHandlerソースがすぐに利用できるという事実を考慮すれば、簡単です。 –

+0

@ ThomasS.Triasそれについてのサンプルはありますか? '派生クラス'? – Kiquenet

4

これはWindowsランタイムアプリケーションのであれば、あなたがプロジェクトに自己署名証明書を追加し、appxmanifestでそれを参照する必要があります。

ドキュメントはここにある: http://msdn.microsoft.com/en-us/library/windows/apps/hh465031.aspx

同じこと、それは(マシン自体が信頼していないプライベートCAのような)信頼されていないCAからだ場合 - あなたはCAの公開証明書を取得する必要があり、それをアプリケーションにコンテンツとして追加し、それをマニフェストに追加します。

これが完了すると、アプリは正しく署名された証明書として認識します。

2

回答はありませんが、私には代替手段があります。

Fiddler2を使用してトラフィックを監視し、HTTPS復号化を有効にすると、開発環境は不平を言うことはありません。標準のアプリケーションをインストールすることができないため、Microsoft SurfaceなどのWinRTデバイスでは動作しません。しかし、あなたの開発Win8コンピュータは問題ありません。

Fiddler2でHTTPS暗号化を有効にするには、ツール> Fiddlerオプション> HTTPS(タブ)>「HTTPSトラフィックの復号化」にチェックを入れます

私はこのスレッドに誰かが優雅なソリューションを望むことを望んでいます。

83

ServicePointManager.ServerCertificateValidationCallbackデリゲートを使用するとすばやく解決できます。これにより、独自の証明書検証を提供することができます。検証は、App Domain全体にグローバルに適用されます。私は私がプロセスでホスティングしていますし、WCF clientまたはHttpClientでそれをヒットしようとしているエンドポイントに対して実行したい状況ではユニットテストのために主にこれを使用

ServicePointManager.ServerCertificateValidationCallback += 
    (sender, cert, chain, sslPolicyErrors) => true; 

プロダクションコードの場合、より細かい制御が必要な場合があり、WebRequestHandlerとそのServerCertificateValidationCallbackデリゲートプロパティを使用する方がよい場合があります(dtb's answer belowを参照)。

+22

downvoterではなく、ServerCertificateValidationCallbackの最大の問題の1つは、基本的にAppDomainにとってグローバルなことです。したがって、信頼できない証明書を持つサイトを呼び出す必要があるライブラリを作成し、この回避策を採用する場合は、ライブラリだけでなく、アプリケーション全体の動作を変更しています。また、人々は常に「盲目的に真実な」アプローチに注意するべきです。深刻なセキュリティ上の問題があります。提供されたパラメータを読み込み、*/trueを返すかどうかを慎重に判断する必要があります。 – scottt732

+0

@ scottt732確かに有効なポイントと言及する価値はありますが、それでも有効な解決策です。おそらく、元の質問をOPによって読んだ後、彼は既にServerCertificateValidationCallbackハンドラを知っていたようだ。 – Bronumski

+2

少なくとも送信者のようないくつかの基準でフィルタリングすることをお勧めします –

20

それとも、Windows.Web.Http名前空間にHttpClientをのために使用することができます。

var filter = new HttpBaseProtocolFilter(); 
#if DEBUG 
    filter.IgnorableServerCertificateErrors.Add(ChainValidationResult.Expired); 
    filter.IgnorableServerCertificateErrors.Add(ChainValidationResult.Untrusted); 
    filter.IgnorableServerCertificateErrors.Add(ChainValidationResult.InvalidName); 
#endif 
using (var httpClient = new HttpClient(filter)) { 
    ... 
} 
+0

'System.Net.Http'、' System.Web'と 'Windows.Web.Http'を一緒に使うことができますか? – Kiquenet

0
HttpClientを、あなたは私が書いたメッセージハンドラアダプタを使用することができます

私はうまくいくように見えるオンラインの例を見つけました:

まず、新しいICertificatePolicy

using System.Security.Cryptography.X509Certificates; 
using System.Net; 

public class MyPolicy : ICertificatePolicy 
{ 
    public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, 
int certificateProblem) 
    { 
    //Return True to force the certificate to be accepted. 
    return true; 
    } 
} 

それからちょうどこの前にそうようにHTTPリクエストを送信するに使用します。

System.Net.ServicePointManager.CertificatePolicy = new MyPolicy(); 

http://www.terminally-incoherent.com/blog/2008/05/05/send-a-https-post-request-with-c/

+0

'ServicePointManager.CertificatePolicy'は廃止予定です:https://docs.microsoft。com/en-us/dotnet/framework/whats-new/obsolete-members – schmidlop

3

はあなたが.NET標準ライブラリでこれを行うにしようとしている場合は、ここにありますあなたのハンドラにただtrueを返すだけのすべてのリスクを伴う単純な解決策です。私はあなたに安全を任せます。

var handler = new HttpClientHandler(); 
handler.ClientCertificateOptions = ClientCertificateOption.Manual; 
handler.ServerCertificateCustomValidationCallback = 
    (httpRequestMessage, cert, cetChain, policyErrors) => 
{ 
    return true; 
}; 

var client = new HttpClient(handler); 
+0

この結果、プラットフォームがuwpから参照されたときにはサポートされません – Ivan

関連する問題