我正在尝试构建一个简单的TLS Web服务器,该服务器在C#的localhost上运行。在这种情况下,我只希望服务器执行重定向。为此,我正在使用Microsoft提供的SslStream
类。表面上似乎很容易使用。我遇到的问题是chrome似乎并没有享受我的HTTPS。 (底部代码)
响应非常简单:SslStream
[使用HTTP实施时,页面将按预期重定向,并且在客户端(Chrome)或服务器上不会发生任何错误或异常。
但是,当使用我的HTTPS实现时,我从chrome中得到了类似的东西:
无法访问此站点
该网页位于.....
ERR_RESPONSE_HEADERS_TRUNCATED
我不确定还要从我这里得到什么。我会说响应头没有被截断,但我不是chrome。调试时,我可以读取chrome的GET请求,但是chrome显然不能读取或不会读取我的响应。
我已经成功使用了完全相同的代码来重定向边缘(http和https),所以这似乎是特定于Chrome的
快速的有线通讯调查显示,直到服务器发送响应之前,一切都没有异常。举例说明:标准tcp syn / ack握手,tls握手,然后是客户端应用。数据(GET)服务器应用程序数据(301)。服务器发送301之后,将有3个FIN / ACK,一个保持活动状态,一个密码更改以及一堆RST。有了这些信息,chrome似乎没有给我们任何东西,但与此同时又没想到我们会抛弃它们,并开始拼命恳求重新连接。奇怪的是,如果我调试,它确实会重新连接。但是随后它抛出异常,因为服务器在读取时超时。我们给了Chrome第二次机会,但是Chrome不愿意将任何东西放回这个已经破裂的关系中,这留下了伤疤。
差不多了,我问的是我在做什么,Chrome显然不希望这样做,我该如何纠正它才能在Chrome上正常工作?我是否在做其他浏览器正在补偿的明显错误的操作,还是SslStream出了问题?
我的TLS代码基本上取自"HTTP/1.1 301 Moved Permanently\r\nCache-Control: no-store\r\nLocation: https://google.com/"
的Microsoft doc,并且http设计遵循相同的模式:接受,读取,写入,刷新,流关闭,tcp关闭。如果要复制,则创建的证书与X509Certificate.CreateFromCertFile(string)一起使用。 SslStream
使用了TcpListener
。为了生成我的证书,我遵循了IPAddress.Loopback
并用this tutorial]导出了我的localhost.crt
和localhost.key
openssl pkcs12
我正在尝试构建一个简单的TLS Web服务器,该服务器在C#的localhost上运行。在这种情况下,我只希望服务器执行重定向。为此,我使用了Microsoft提供的SslStream类。它...