HTTPS和HTTP协议之间有什么不同吗?

时间:2012-03-07 09:48:46

标签: c# ssl https web

(除了安全套接字和基础传输协议,我的意思是)

我正在尝试在C#中实现最基本的HTTP服务器(具体来说,我正在尝试让我的程序创建一个侦听http://localhost:nnnn的本地套接字,其中nnnn是一个自定义端口号,响应为如果它是一个安全的Web服务器)。

我已经有了基本的通信代码,接受连接,接收请求和响应GET。我知道这在原理上是有效的,因为如果我通过标准HTTP将我的浏览器指向我的监听套接字,那么一切正常并且它很愉快地显示我返回的网页。

但是,如果我尝试使用HTTPS连接(我使用不同的端口号),它会连接,接受甚至获取GET请求 - 但是尽管我返回了响应,但浏览器似乎挂起,好像在等待对于别的东西 - 但据我所知,我接收没有别的东西(我仍在监听连接,以防它决定进行其他连接)。

我的回答是:

HTTP/1.1 200 OK
Host: localhost:4301
Date: <assume date is correctly formatted>
Content-Type: text/html; charset=us-ascii
Content-Length: 52
Connection: Keep-Alive

<html><head></head><body>Hello, World!</body></html>

正如我所说,这适用于标准HTTP - 浏览器接受它。我试图包括我认为它可能会坚持的标题项(我也尝试过Connection:关闭并强行终止连接 - 在这种情况下,浏览器显示连接问题。它发送的GET指定Keep-Alive,所以我回到了那个)。

是否有一些我缺少的东西让浏览器接受HTTPS的响应,就像它对HTTP一样?

如果有帮助,我收到的HTTPS案件的GET请求是:

GET /test.html?param1=Test HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: en-US
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Accept-Encoding: gzip, deflate
Host: localhost:4301
Connection: Keep-Alive

另外,我正在使用使用MAKECERT创建的自签名证书 - 我必须接受警告并强制浏览器继续访问该页面,但重点是,它 最终发送GET请求。

1 个答案:

答案 0 :(得分:1)

呃......尴尬。事实证明,我正在向错误的信息流发送我完美形成的回应。我将它发送回标准的NetworkStream对象而不是SslStream对象。当你正确编码时,事情会更好地发挥作用{:v(