Windows 8 アプリケーションが SSL 経由でテスト Web API と通信するのに苦労しています。
HttpClient/HttpClientHandler が提供していないようで、WebRequest のような信頼されていない証明書を無視するオプションを使用すると、( ServerCertificateValidationCallback
.
どんな助けでも大歓迎です!
Windows 8 アプリケーションが SSL 経由でテスト Web API と通信するのに苦労しています。
HttpClient/HttpClientHandler が提供していないようで、WebRequest のような信頼されていない証明書を無視するオプションを使用すると、( ServerCertificateValidationCallback
.
どんな助けでも大歓迎です!
手っ取り早い解決策は、ServicePointManager.ServerCertificateValidationCallback
デリゲートを使用することです。これにより、独自の証明書検証を提供できます。検証は、アプリ ドメイン全体にグローバルに適用されます。
ServicePointManager.ServerCertificateValidationCallback +=
(sender, cert, chain, sslPolicyErrors) => true;
これは主に、処理中にホストしているエンドポイントに対して実行したい状況でのユニット テストに使用し、WCF クライアントまたはHttpClient
.
本番コードの場合、よりきめ細かい制御が必要な場合があり、WebRequestHandler
とそのServerCertificateValidationCallback
デリゲート プロパティを使用する方がよいでしょう (以下の dtb の回答を参照してください)。または、 を使用してctackeに回答HttpClientHandler
します。他のフックが見つからない限り、以前の方法よりも統合テストを行っても、これら2つのいずれかを好むようになりました。
WebRequestHandler クラスとそのServerCertificateValidationCallback プロパティを見てください。
using (var handler = new WebRequestHandler())
{
handler.ServerCertificateValidationCallback = ...
using (var client = new HttpClient(handler))
{
...
}
}
または、名前空間でHttpClientに使用できます。Windows.Web.Http
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)) {
...
}
これが Windows ランタイム アプリケーションの場合は、自己署名証明書をプロジェクトに追加し、appxmanifest で参照する必要があります。
ドキュメントはこちら: http://msdn.microsoft.com/en-us/library/windows/apps/hh465031.aspx
信頼されていない CA (マシン自体が信頼していないプライベート CA など) からのものである場合も同様です。CA のパブリック証明書を取得し、コンテンツとしてアプリに追加してから、マニフェストに追加する必要があります。
それが完了すると、アプリはそれを正しく署名された証明書として認識します。
答えはありませんが、別の方法はあります。
Fiddler2を使用してトラフィックを監視し、HTTPS復号化を有効にすると、開発環境で問題が発生することはありません。標準のアプリをインストールできないため、これはMicrosoftSurfaceなどのWinRTデバイスでは機能しません。しかし、開発用のWin8コンピューターは問題ありません。
Fiddler2でHTTPS暗号化を有効にするには、[ツール]>[Fiddlerオプション]>[HTTPS(タブ)]>[HTTPSトラフィックの復号化]をオンにします。
誰かがエレガントな解決策を持ってくれることを期待して、このスレッドに目を光らせていきます。
Xamarin Android の場合、これが唯一有効な解決策でした:別のスタック オーバーフローの投稿
を使用している場合は、すべてのチェックを無効にしておよび のカスタム実装AndroidClientHandler
を提供する必要があります。これを行うには、適切なメソッドをサブクラス化してオーバーライドする必要があります。SSLSocketFactory
HostnameVerifier
AndroidClientHandler
internal class BypassHostnameVerifier : Java.Lang.Object, IHostnameVerifier
{
public bool Verify(string hostname, ISSLSession session)
{
return true;
}
}
internal class InsecureAndroidClientHandler : AndroidClientHandler
{
protected override SSLSocketFactory ConfigureCustomSSLSocketFactory(HttpsURLConnection connection)
{
return SSLCertificateSocketFactory.GetInsecure(1000, null);
}
protected override IHostnameVerifier GetSSLHostnameVerifier(HttpsURLConnection connection)
{
return new BypassHostnameVerifier();
}
}
その後
var httpClient = new System.Net.Http.HttpClient(new InsecureAndroidClientHandler());