当服务器具有有效的 SSL 证书时,将 WebClient.UploadFile() 与“https”一起使用时出现“握手失败...意外的数据包格式”

Posted

技术标签:

【中文标题】当服务器具有有效的 SSL 证书时,将 WebClient.UploadFile() 与“https”一起使用时出现“握手失败...意外的数据包格式”【英文标题】:Getting "Handshake failed...unexpected packet format" when using WebClient.UploadFile() with "https" when the server has a valid SSL certificate 【发布时间】:2013-05-29 12:42:56 【问题描述】:

我正在尝试将 WebClient.UploadFile 与 HTTPS URL 一起使用,但我最终得到了

“System.IO.IOException:握手失败由于意外 数据包格式”

相同的代码在 Http 上运行得非常好,但我试图访问的服务器有一个非常好的 ssl 证书。以下是与网络通话相关的任何内容:

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?

【问题讨论】:

System.IO.IOException: The handshake failed due to an unexpected > packet format? 中的类似错误 这通常发生在您使用 https 连接到网络服务器但网络服务器未设置为 https 的情况下。尝试在 URL 中使用 http:// 而不是 https://。 【参考方案1】:

如果您像我一样一无所知并且没有意识到您的 Web 服务器项目已经崩溃并且不再运行,您也可能会收到此错误。

【讨论】:

【参考方案2】:

您必须确保您连接的端口是端口 443 而不是端口 80。

明确设置要在 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();

【讨论】:

你是正确的。我已将我的 Web 字符串硬编码为 httpS://example.com:80,注意冲突的协议 80 和以 HTTPS 开头的 url。菜鸟失误。

以上是关于当服务器具有有效的 SSL 证书时,将 WebClient.UploadFile() 与“https”一起使用时出现“握手失败...意外的数据包格式”的主要内容,如果未能解决你的问题,请参考以下文章

当 SMTP 服务器具有有效证书时,获取“根据验证程序,远程证书无效”

如果套接字握手中的客户端证书中有两个有效证书,则在 SSL 连接中使用哪个证书

连接需要具有 ssl 模式的 laravel google cloud postgres 中的有效客户端证书

阿里云购买的域名,买的ssl证书,怎么让证书有效?怎么配置证书到域名上面去

通过 SSL 将 phpMyAdmin 连接到 MySQL 服务器

https证书存在错误怎么解决