364

C# (2.0) で記述された Web サービスに対して、Visual Studio によって生成された Web サービス プロキシを介して、.NET (C#) 2.0 Windows アプリによって生成された単純な Web サービス呼び出しがあります。これは数年間機能しており、実行されている 12 か所ほどの場所で機能し続けています。

新しいサイトでの新しいインストールで問題が発生しています。Web サービスを呼び出そうとすると、次のメッセージで失敗します。

SSL/TLS セキュア チャネルの信頼関係を確立できませんでした

Web サービスの URL は SSL (https://) を使用していますが、これは他の多くの場所から長い間機能しています (そして現在も機能し続けています)。

私はどこを見ますか?これは、このインストールに固有の Windows と .NET 間のセキュリティ上の問題でしょうか? その場合、どこで信頼関係を設定すればよいですか? 道に迷いました!

4

19 に答える 19

392

次のスニペットは、呼び出しているサーバーの SSL 証明書に問題がある場合を修正します。たとえば、自己署名されているか、証明書とサーバー間のホスト名が一致していない可能性があります。

直接制御できないサーバーを呼び出している場合、これは危険です。これは、自分が接続していると考えているサーバーと通信していることを確信できなくなるためです。ただし、内部サーバーを扱っていて、「正しい」証明書を取得することが実際的でない場合は、次の方法を使用して Web サービスに証明書の問題を無視し、勇敢に対処するように指示してください。

最初の 2 つはラムダ式を使用し、3 番目は通常のコードを使用します。1 つ目は、任意の証明書を受け入れます。少なくとも最後の 2 つは、証明書のホスト名が期待どおりのものであることを確認します。
...お役に立てば幸いです

//Trust all certificates
System.Net.ServicePointManager.ServerCertificateValidationCallback =
    ((sender, certificate, chain, sslPolicyErrors) => true);

// trust sender
System.Net.ServicePointManager.ServerCertificateValidationCallback
                = ((sender, cert, chain, errors) => cert.Subject.Contains("YourServerName"));

// validate cert by calling a function
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);

// callback used to validate the certificate in an SSL conversation
private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors)
{
    bool result = cert.Subject.Contains("YourServerName");
    return result;
}
于 2011-07-07T15:52:52.180 に答える
200

非常に単純な「キャッチオール」ソリューションは次のとおりです。

System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

sebastian-castaldi のソリューションはもう少し詳細です。

于 2013-03-18T18:00:00.827 に答える
185

感想(過去の痛みに基づく):

  • DNS とサーバーへの見通し線はありますか?
  • 証明書の正しい名前を使用していますか?
  • 証明書はまだ有効ですか?
  • 不適切に構成されたロードバランサーが問題を引き起こしていますか?
  • 新しいサーバーマシンの時計は正しく設定されていますか (つまり、UTC 時刻が正しい [ローカル時刻を無視します。ほとんど無関係です]) - これは確かに WCF にとって重要なので、通常の SOAP に影響を与える可能性があります。
  • 証明書信頼チェーンの問題はありますか? サーバーからsoapサービスにブラウジングすると、SSLは取得できますか?
  • 上記に関連 - 証明書は正しい場所にインストールされていますか? (信頼されたルート証明機関でコピーが必要になる場合があります)
  • サーバーのマシンレベルのプロキシは正しく設定されていますか? (ユーザーのプロキシとは異なります); XP / 2003 の場合は proxycfg を参照してください (Vista などについては不明)
于 2009-03-31T22:11:26.880 に答える
38

私は個人的に次の解決策が最も好きです:

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

...次に、エラーの取得を要求する前に、次の手順を実行します

System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; };

Luke'sSolutionに相談した後にこれを見つけました

于 2013-02-26T22:59:24.083 に答える
23

すべての人をやみくもに信頼したくなく、特定のホストに対してのみ信頼の例外を作成したくない場合は、次の解決策がより適切です。

public static class Ssl
{
    private static readonly string[] TrustedHosts = new[] {
      "host1.domain.com", 
      "host2.domain.com"
    };

    public static void EnableTrustedHosts()
    {
      ServicePointManager.ServerCertificateValidationCallback = 
      (sender, certificate, chain, errors) =>
      {
        if (errors == SslPolicyErrors.None)
        {
          return true;
        }

        var request = sender as HttpWebRequest;
        if (request != null)
        {
          return TrustedHosts.Contains(request.RequestUri.Host);
        }

        return false;
      };
    }
}

次に、アプリの起動時に Ssl.EnableTrustedHosts を呼び出すだけです。

于 2014-10-08T07:58:09.103 に答える
18

Windows 2003 を使用している場合は、これを試すことができます。

Microsoft 管理コンソールを開きます (スタート --> ファイル名を指定して実行 --> mmc.exe)。

[ファイル] --> [スナップインの追加と削除] を選択します。

[スタンドアロン] タブで、[追加] を選択します。

[証明書] スナップインを選択し、[追加] をクリックします。

ウィザードで、[コンピューター アカウント] を選択し、[ローカル コンピューター] を選択します。Finish を押してウィザードを終了します。

[スナップインの追加と削除] ダイアログを閉じます。

[証明書 (ローカル コンピューター)] に移動し、インポートするストアを選択します。

証明書を発行した会社のルート CA 証明書がある場合は、[信頼されたルート証明機関] を選択します。

サーバー自体の証明書がある場合は、[その他の人] を選択します。

ストアを右クリックし、[すべてのタスク] --> [インポート] を選択します

ウィザードに従って、所有している証明書ファイルを提供します。

その後、IIS を再起動して、Web サービスを再度呼び出してみてください。

参照: http://www.outsystems.com/NetworkForums/ViewTopic.aspx?Topic=Web-Services:-Could-not-built-trust-relationship-for-the-SSL/TLS- ...

于 2011-03-25T00:10:56.250 に答える
7

ルークはこれについてかなり良い記事を書きました..かなり簡単です..これを試してみてください

ルークのソリューション

理由 (彼の記事からの引用 (呪いを除く)) "..上記のコードの問題は、証明書が有効でない場合に機能しないことです。無効な SSL 証明書を使用して Web ページに投稿する必要があるのはなぜですか?私はお金がかからず、Verisign や他の**- * にお金を払ってテスト ボックスへの証明書を購入する気にはなれなかったので、自己署名したのですが、リクエストを送信すると、素敵な例外がスローされました。

System.Net.WebException 基になる接続が閉じられました。リモート サーバーとの信頼関係を確立できませんでした。

あなたのことはわかりませんが、私には、その例外は、POST が失敗する原因となった私のコードのばかげた間違いによって引き起こされるもののように見えました。だから私は探し続け、あらゆる種類の奇妙なことを微調整し、実行しました。***n をグーグル検索した後で初めて、無効な SSL 証明書に遭遇した後のデフォルトの動作は、まさにこの例外をスローすることであることがわかりました。..」

于 2012-10-25T19:36:27.027 に答える
7

Microsoft のSSL 診断ツールが問題の特定に役立つ場合があります。

UPDATEリンクは現在修正されています。

于 2009-03-31T22:36:53.010 に答える
3

.NETInternet Explorerのアプリで同様の問題が発生しました。

信頼できるエディター証明書に証明書 (私の場合は VeriSign Class 3 証明書) を追加する問題を解決しました。

Go to Internet Options-> Content -> Publishers and import it

次の場所からエクスポートすると、証明書を取得できます。

Internet Options-> Content -> Certificates -> Intermediate Certification Authorities -> VeriSign Class 3 Public Primary Certification Authority - G5

ありがとう

于 2015-05-25T14:07:40.047 に答える
3

この問題が発生しました。私の解決策は、タイム サーバーに手動で同期してシステム時刻を更新することでした。これを行うには、次のことができます。

  • タスクバーの時計を右クリック
  • 選択するAdjust Date/Time
  • Internet Timeタブを選択
  • クリックChange Settings
  • 選択するUpdate Now

私の場合、これは正しく同期されていなかったため、正しく更新されるまでに数回クリックする必要がありました。正しく更新されない場合は、サーバー ドロップダウンから別のタイム サーバーを使用してみてください。

于 2013-02-22T16:09:16.513 に答える
2

これを追加:

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

サービスを呼び出している行の直前

于 2020-06-23T12:17:17.590 に答える
1

VS クライアント側でこの問題が発生している場合、サービス参照を正常に追加し、最初の呼び出しを実行しようとすると、次の例外が発生しました。 (私の場合のように) IP アドレスを持つエンドポイント URL を使用していて、この例外が発生した場合は、おそらく次の手順を実行してサービス参照を再度追加する必要があります。

  • Internet Explorer でエンドポイント URL を開きます。
  • 証明書エラー (アドレス バーの赤いアイコン) をクリックします。
  • [証明書の表示] をクリックします。
  • 発行された宛先「名前」を取得し、IP アドレスまたは使用していた名前を置き換えて、この「名前」のエラーを取得します。

再試行 :)。ありがとう

于 2017-06-12T20:28:05.013 に答える
0

私の場合、IIS 7 を使用して Visual Studio 環境でSSLをテストしようとしていました。

これは私がそれを機能させるためにやったことです:

  • IIS の右側の [バインディング...] セクションにある私のサイトの下で、ポート 443 に「https」バインディングを追加し、[IIS Express Development Certificate] を選択する必要がありました。

  • 右側の「詳細設定...」セクションの私のサイトの下で、「有効なプロトコル」を「http」から「https」に変更する必要がありました。

  • 「SSL 設定」アイコンの下で、クライアント証明書に「同意する」を選択しました。

  • 次に、アプリ プールをリサイクルする必要がありました。

  • また、mmc.exe を使用して、ローカル ホスト証明書を個人用ストアにインポートする必要がありました。

私のweb.configファイルはすでに正しく構成されていたので、上記のすべてを整理した後、テストを続けることができました。

于 2014-02-17T17:55:24.130 に答える
-2

ServerCertificateValidationCallback が true を返したときに、無効な証明書が機能しない場合。 私の ServerCertificateValidationCallback コード:

ServicePointManager.ServerCertificateValidationCallback += delegate
{
    LogWriter.LogInfo("Проверка сертификата отключена, на уровне ServerCertificateValidationCallback");
    return true;
};

ServerCertificateValidationCallback の実行を妨げた私のコード:

     if (!(ServicePointManager.CertificatePolicy is CertificateValidation))
    {
        CertificateValidation certValidate = new CertificateValidation();
        certValidate.ValidatingError += new CertificateValidation.ValidateCertificateEventHandler(this.OnValidateCertificateError);
        ServicePointManager.CertificatePolicy = certValidate;
    }

OnValidateCertificateError 関数:

private void OnValidateCertificateError(object sender, CertificateValidationEventArgs e)
{
    string msg = string.Format(Strings.OnValidateCertificateError, e.Request.RequestUri, e.Certificate.GetName(), e.Problem, new Win32Exception(e.Problem).Message);
    LogWriter.LogError(msg);
    //Message.ShowError(msg);
}

私はCertificateValidationコードを無効にし、ServerCertificateValidationCallbackが非常にうまく動作しています

于 2017-01-10T11:17:07.717 に答える