1

こんにちは、Https で WebRequest を投稿しようとして問題が発生しています。

次のエラーを受け取りました

1.-基になる接続が閉じられました: リモート サーバーに接続できません。

2.-操作タイムアウト

3-基になる接続が閉じられました: SSL/TLS の安全なチャネルを確立できませんでした。

私は自分の会社と顧客の会社の約 3 つまたは 4 つの異なるプロキシで試しましたが、制限なしで ISP プロバイダーと直接接続している場合でも、次のメソッドを実行すると上記のエラーが発生します

WebRequest.GetRequestStream() 

これがプロキシの背後で発生するかどうかにかかわらず、リクエストはプロキシの背後にある 1 台の PC からのみ正常に投稿できます。プロキシにクライアント証明書がインストールされていません。

これは .net フレームワーク 1.1 の下にあり、要求には既にネットワーク資格情報が含まれています。

何ができますか?

アップデート

内部例外 3 番目のエラーは次のとおりです。関数は正常に完了しましたが、コンテキストを完了するために再度呼び出す必要があります。

iisper.h のドキュメントによると、このエラーは

//
// MessageId: SEC_I_CONTINUE_NEEDED
//
// MessageText:
//
//  The function completed successfully, but must be called
//  again to complete the context
//
#define SEC_I_CONTINUE_NEEDED            ((HRESULT)0x00090312L)

MSDNでは、これは

SEC_I_CONTINUE_NEEDED クライアントは出力トークンをサーバーに送信し、返されるトークンを待つ必要があります。返されたトークンは、InitializeSecurityContext (Schannel) への別の呼び出しで渡されます。出力トークンは空にすることができます。

これは、PC にクライアント証明書がないということですか?

4

4 に答える 4

1

SSL証明書との不一致など、物事を複雑にする可能性のあるものはたくさんあります.しかし、最初に、明らかなことを除外するためにいくつかの基本的なデバッグを行う必要があります:

-- 簡単な Web リクエストを他のサーバーに送信してみましたか? (安全でない) http と (安全な) https の両方を試す

-- 別のコンピュータまたは別のネットワークから接続しようとしましたか? クライアントはプロキシの背後にあるとおっしゃいました。最初にプロキシを使用するコンピューターを試して、それを除外します。

-- セッション内で複数の WebRequest を作成していますか? オープン リクエストの数にはハード リミットがあるため、WebResponse を取得したら、それらをクローズしていることを確認してください。おそらく、1 つの要求だけでテスト プログラムを作成します。

それでも絞り込めない場合は、おそらくサーバーまたはプロキシが複雑になっている可能性があります。netshark などのプログラムを使用して発信ネットワーク パケットを追跡し、問題が発生している場所を追跡できます。

于 2008-11-13T07:00:24.473 に答える
1

FiddlerまたはEthereal Wiresharkなどのネットワーク パケット スニッフィング ツールを、それが動作しているマシンと他のマシンのいずれかで使用して、HTTP トラフィックのトレースを作成し、結果を比較できます。これはかなり低レベルですが、問題に光を当てる可能性があります。

于 2008-11-13T07:16:43.880 に答える
1
  • 異なるマシンから 443 に telnet できる場合、それは最初の 2 つではありません。これは、クライアント マシンがそのポートで要求を受信して​​いることを意味します。

になるウィンドウで

telnet <domainname> 443

接続すると、画面が空白になります(リターンを数回押して終了します)

  • プロキシは、HTTPS の下にある場合、リクエストを読み取ることができないため、実際にリクエストを気にする場合と気にしない場合があります。

  • 他のマシンにクライアント証明書と証明書チェーンがインストールされていますか?

于 2008-11-13T07:20:30.423 に答える
0

SSL 証明書名が一致していない可能性があります。これは、多くの場合、自己署名証明書に当てはまります。

解決策は、常に true を返す独自の認証ルーチンを作成するか、証明書が有効であることを確認するために必要な認証を行うことです。

// .NET 2.0+
...
ServicePointManager.ServerCertificateValidationCallback += MyValidationCallback
...
public bool MyValidationCallback(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors err)
{
  return true;
}

// .NET 1.1
public class MyCertificatePolicy : ICertificatePolicy
{
  public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem)
  {
    return true;
  }
}
...
ServicePointManager.CertificatePolicy = new MyCertificatePolicy();
...
于 2008-11-13T06:57:20.097 に答える