私は、Windows 8アプリケーションがSSL経由でテスト用Web APIと通信するのを苦労しています。HttpClientで信頼されていないSSL証明書を許可する
HttpClient/HttpClientHandlerはWebRequestのような信頼できない証明書を無視するオプションを提供していないと思われますが(ServerCertificateValidationCallback
で「ハッキー」ではありますが)
ご協力いただければ幸いです。
私は、Windows 8アプリケーションがSSL経由でテスト用Web APIと通信するのを苦労しています。HttpClientで信頼されていないSSL証明書を許可する
HttpClient/HttpClientHandlerはWebRequestのような信頼できない証明書を無視するオプションを提供していないと思われますが(ServerCertificateValidationCallback
で「ハッキー」ではありますが)
ご協力いただければ幸いです。
Windows 8.1では、無効なSSL証明書を信頼できるようになりました。 Windows.Web.HttpClientを使用するか、System.Net.Httpを使用する必要があります。 http://www.nuget.org/packages/WinRtHttpClientHandler
ドキュメントはGitHubの上にある: https://github.com/onovotny/WinRtHttpClientHandler
すべてのコードを使用せずにこれを行う方法はありますか?つまり、あなたのソリューションの要点は何ですか? – wensveen
解決策の要点は、Windowsのhttpクライアントハンドラをラップし、それをHttpClientの実装として使用することです。このファイルはすべてこのファイルに含まれています:https://github.com/onovotny/WinRtHttpClientHandler/blob/master/WinRtHttpClientHandler/WinRtHttpClientHandler.csは自由にコピーできますが、単にパッケージを使用するだけではわかりません。 –
はWebRequestHandler ClassとそのServerCertificateValidationCallback Propertyを見てください:
using (var handler = new WebRequestHandler())
{
handler.ServerCertificateValidationCallback = ...
using (var client = new HttpClient(handler))
{
...
}
}
これはWindowsランタイムアプリケーションのであれば、あなたがプロジェクトに自己署名証明書を追加し、appxmanifestでそれを参照する必要があります。
ドキュメントはここにある: http://msdn.microsoft.com/en-us/library/windows/apps/hh465031.aspx
同じこと、それは(マシン自体が信頼していないプライベートCAのような)信頼されていないCAからだ場合 - あなたはCAの公開証明書を取得する必要があり、それをアプリケーションにコンテンツとして追加し、それをマニフェストに追加します。
これが完了すると、アプリは正しく署名された証明書として認識します。
回答はありませんが、私には代替手段があります。
Fiddler2を使用してトラフィックを監視し、HTTPS復号化を有効にすると、開発環境は不平を言うことはありません。標準のアプリケーションをインストールすることができないため、Microsoft SurfaceなどのWinRTデバイスでは動作しません。しかし、あなたの開発Win8コンピュータは問題ありません。
Fiddler2でHTTPS暗号化を有効にするには、ツール> Fiddlerオプション> HTTPS(タブ)>「HTTPSトラフィックの復号化」にチェックを入れます。
私はこのスレッドに誰かが優雅なソリューションを望むことを望んでいます。
ServicePointManager.ServerCertificateValidationCallback
デリゲートを使用するとすばやく解決できます。これにより、独自の証明書検証を提供することができます。検証は、App Domain全体にグローバルに適用されます。私は私がプロセスでホスティングしていますし、WCF clientまたはHttpClient
でそれをヒットしようとしているエンドポイントに対して実行したい状況ではユニットテストのために主にこれを使用
ServicePointManager.ServerCertificateValidationCallback +=
(sender, cert, chain, sslPolicyErrors) => true;
。
プロダクションコードの場合、より細かい制御が必要な場合があり、WebRequestHandler
とそのServerCertificateValidationCallback
デリゲートプロパティを使用する方がよい場合があります(dtb's answer belowを参照)。
downvoterではなく、ServerCertificateValidationCallbackの最大の問題の1つは、基本的にAppDomainにとってグローバルなことです。したがって、信頼できない証明書を持つサイトを呼び出す必要があるライブラリを作成し、この回避策を採用する場合は、ライブラリだけでなく、アプリケーション全体の動作を変更しています。また、人々は常に「盲目的に真実な」アプローチに注意するべきです。深刻なセキュリティ上の問題があります。提供されたパラメータを読み込み、*/trueを返すかどうかを慎重に判断する必要があります。 – scottt732
@ scottt732確かに有効なポイントと言及する価値はありますが、それでも有効な解決策です。おそらく、元の質問をOPによって読んだ後、彼は既にServerCertificateValidationCallbackハンドラを知っていたようだ。 – Bronumski
少なくとも送信者のようないくつかの基準でフィルタリングすることをお勧めします –
それとも、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)) {
...
}
'System.Net.Http'、' System.Web'と 'Windows.Web.Http'を一緒に使うことができますか? – Kiquenet
私はうまくいくように見えるオンラインの例を見つけました:
まず、新しい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/
'ServicePointManager.CertificatePolicy'は廃止予定です:https://docs.microsoft。com/en-us/dotnet/framework/whats-new/obsolete-members – schmidlop
はあなたが.NET標準ライブラリでこれを行うにしようとしている場合は、ここにありますあなたのハンドラにただtrue
を返すだけのすべてのリスクを伴う単純な解決策です。私はあなたに安全を任せます。
var handler = new HttpClientHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.ServerCertificateCustomValidationCallback =
(httpRequestMessage, cert, cetChain, policyErrors) =>
{
return true;
};
var client = new HttpClient(handler);
この結果、プラットフォームがuwpから参照されたときにはサポートされません – Ivan
.NETコアを使用している場合は、[こちら](https://stackoverflow.com/a/44540071/5549643)の回答に興味があります。 – kdaveid