1. ホーム
  2. c#

[解決済み] サーバーに有効なSSL証明書がある場合にWebClient.UploadFile()をhttpsで使用すると、「Handshake failed...unexpected packet format」と表示される。

2022-01-26 20:51:43

質問事項

HTTPS URL で WebClient.UploadFile を使用しようとしていますが、次のような結果に終わっています。

"System.IO.IOException。予期せぬ事態によりハンドシェイクに失敗しました。 パケット形式です。

同じコードはHttpでは全く問題なく動作しますが、私がヒットさせようとしているサーバーは全く問題なくssl証明書を持っています。以下は、Webコールに関連するものです。

var url = WebServiceCommunication.GetProtocolName() + "..."; //turns out to be     "https://...
var wc = new WebClient();
//I am adding: 
wc.Headers.Add(HttpRequestHeader.KeepAlive, "...")
wc.Headers.Add(HttpRequestHeader.AcceptLanguage, "...")
we.Headers.Add(HttpRequestHeader.Cookie, "...")

wc.UploadFile(url, "POST", filename);

問題は、私が追加しているHttpRequestHeadersのどれかと、それらでhttpsを使用することでしょうか?それとも、httpsを使用したい場合、必要なヘッダーが足りないのでしょうか?また、SSL証明書が有効な場合、なぜHTTPでは動作するが、HTTPSでは動作しないのか、誰かポインタをお持ちですか?

解決方法は?

接続先のポートが80番ではなく443番であることを確認する必要があります。

URLに使用するポートを明示的に設定した例。

var request = (HttpWebRequest) WebRequest.Create("https://example.com:443/");
request.Method = "GET";
request.UserAgent = "example/1.0";
request.Accept = "*/*";
request.Host = "example.com";

var resp = (HttpWebResponse) request.GetResponse();