web-dev-qa-db-ja.com

C#HttpWebRequest基になる接続が閉じられました:送信時に予期しないエラーが発生しました

私はグーグルで、自分で見つけたり考えたりできるすべてのソリューションを試してきました。ロードしようとしているサイトは、TLS1.2の問題ではないことを確認するためにテストしようとした他のいくつかのサイトと同様に、TLS1.2を実行しています。他のサイトは正常にロードされました。

byte[] buffer = Encoding.ASCII.GetBytes(
    "mod=www&ssl=1&dest=account_settings.ws"
    + "&username=" + username.Replace(" ", "20%")
    + "&password=" + password.Replace(" ", "20%"));

ServicePointManager.MaxServicePointIdleTime = 1000;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

HttpWebRequest WebReq =
    (HttpWebRequest)WebRequest.Create(
        "https://secure.runescape.com/m=weblogin/login.ws");

WebReq.Method = "POST";
WebReq.KeepAlive = false;

WebReq.Referer =
    "https://secure.runescape.com/m=weblogin/loginform.ws"
    + "?mod=www&ssl=1&expired=0&dest=account_settings.ws";

WebReq.ContentType = "application/x-www-form-urlencoded";
WebReq.ContentLength = buffer.Length;
Stream PostData = WebReq.GetRequestStream();
PostData.Write(buffer, 0, buffer.Length);
PostData.Close();
HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
Stream Answer = WebResp.GetResponseStream();
StreamReader _Answer = new StreamReader(Answer);
reply = _Answer.ReadToEnd();
curAccount++;
if (reply.Contains("Login Successful"))
{
     eturn true;
}
else
{
     eturn false;
}

何をしようとしても例外が発生し続ける

基になる接続が閉じられました:送信で予期しないエラーが発生しました。

私が見つけた詳細の下で

リモートパーティがトランスポートストリームを閉じたため、認証に失敗しました。

28
Rob

.Netフレームワークの4.0バージョンでは、 ServicePointManager.SecurityProtocol のみが提供されていました 2つのオプション 設定:

  • Ssl3:Secure Socket Layer(SSL)3.0セキュリティプロトコル。
  • Tls:Transport Layer Security(TLS)1.0セキュリティプロトコル

フレームワークの次のリリースでは、 SecurityProtocolType 列挙子が新しいTlsプロトコルで拡張されたため、アプリケーションが4.5バージョンを使用できる場合は、以下も使用できます。

  • Tls11:Transport Layer Security(TLS)1.1セキュリティプロトコルを指定します
  • Tls12:トランスポート層セキュリティ(TLS)1.2セキュリティプロトコルを指定します。

.Net 4.5を使用している場合は、行を変更してください

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

servicePointManagerがTls12接続をサポートするストリームを作成するようにします。

列挙値をフラグとして使用できるため、複数のプロトコルを論理ORで結合できることに注意してください。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | 
                                       SecurityProtocolType.Tls11 |
                                       SecurityProtocolType.Tls12;


サポートするプロトコルの数をできるだけ少なくして、現在のセキュリティ標準に合わせて最新の状態に保つようにしてください。 Ssll3はもはや安全とは見なされず、Tls1.0 SecurityProtocolType.Tlsの使用は辞退しています。

84
rene

この例外が発生しましたが、ServicePointManager.SecurityProtocolにも関連していました。

私にとっては、これはServicePointManager.SecurityProtocolTls | Tls11に設定されていたため(特定のWebサイトが壊れたTLS 1.2でアクセスするため)、TLS 1.2のみのWebサイトにアクセスすると( SSLLabs 'SSLレポート )、失敗しました。

.NET 4.5以降のオプションは、すべてのTLSバージョンを有効にすることです。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
                                     | SecurityProtocolType.Tls11
                                     | SecurityProtocolType.Tls12;
15
Simon Shine

.Net 4を使用する場合:

ServicePointManager.SecurityProtocol = (SecurityProtocolType)768 | (SecurityProtocolType)3072;
7
Barun

WebTestPlugInのコード

public class Protocols : WebTestPlugin
{

    public override void PreRequest(object sender, PreRequestEventArgs e)
    {
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

    }

}
1
venkata ravi