HTTPS和HTTP协议有什么不同吗
本文关键字:什么 HTTP 协议 HTTPS | 更新日期: 2023-09-27 18:26:56
(除了安全套接字和底层传输协议,我的意思是)
我正在尝试用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-浏览器接受它。我试图包括我认为它可能会坚持的标题项目(我还尝试了连接:关闭并强制终止连接-在这种情况下,浏览器显示出连接问题。它发送的GET指定了Keep Alive,所以我返回到该选项)。
让浏览器像接受HTTP一样接受HTTPS响应,我是否缺少了什么?
如果有帮助的话,我收到的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请求。
Ugh。。。令人尴尬的原来我是在发送我完美的回复。。。在错误的流上。我在标准NetworkStream对象上而不是在SslStream对象上发回它。有趣的是,当你正确地编码时,事情会更好地工作{:v(