155

Windows 8 アプリケーションが SSL 経由でテスト Web API と通信するのに苦労しています。

HttpClient/HttpClientHandler が提供していないようで、WebRequest のような信頼されていない証明書を無視するオプションを使用すると、( ServerCertificateValidationCallback.

どんな助けでも大歓迎です!

4

12 に答える 12

178

手っ取り早い解決策は、ServicePointManager.ServerCertificateValidationCallbackデリゲートを使用することです。これにより、独自の証明書検証を提供できます。検証は、アプリ ドメイン全体にグローバルに適用されます。

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

これは主に、処理中にホストしているエンドポイントに対して実行したい状況でのユニット テストに使用し、WCF クライアントまたはHttpClient.

本番コードの場合、よりきめ細かい制御が必要な場合があり、WebRequestHandlerとそのServerCertificateValidationCallbackデリゲート プロパティを使用する方がよいでしょう (以下の dtb の回答を参照してください)。または、 を使用してctackeに回答HttpClientHandlerします。他のフックが見つからない限り、以前の方法よりも統合テストを行っても、これら2つのいずれかを好むようになりました。

于 2013-08-14T12:39:25.617 に答える
100

WebRequestHandler クラスとそのServerCertificateValidationCallback プロパティを見てください。

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

    using (var client = new HttpClient(handler))
    {
        ...
    }
}
于 2012-09-23T16:04:52.390 に答える
26

または、名前空間で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)) {
    ...
}
于 2015-02-27T10:39:54.003 に答える
7

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

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

信頼されていない CA (マシン自体が信頼していないプライベート CA など) からのものである場合も同様です。CA のパブリック証明書を取得し、コンテンツとしてアプリに追加してから、マニフェストに追加する必要があります。

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

于 2013-01-04T23:36:21.410 に答える
2

答えはありませんが、別の方法はあります。

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

Fiddler2でHTTPS暗号化を有効にするには、[ツール]>[Fiddlerオプション]>[HTTPS(タブ)]>[HTTPSトラフィックの復号化]をオンにします。

誰かがエレガントな解決策を持ってくれることを期待して、このスレッドに目を光らせていきます。

于 2013-02-04T23:38:36.850 に答える
0

Xamarin Android の場合、これが唯一有効な解決策でした:別のスタック オーバーフローの投稿

を使用している場合は、すべてのチェックを無効にしておよび のカスタム実装AndroidClientHandlerを提供する必要があります。これを行うには、適切なメソッドをサブクラス化してオーバーライドする必要があります。SSLSocketFactoryHostnameVerifierAndroidClientHandler

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());
于 2020-12-14T06:14:37.830 に答える