使用来自HTTPS

时间:2015-04-24 17:12:18

标签: c# sockets

我有一个通过system.net.socket侦听9002端口的Windows应用程序。

如果客户通过http url发送请求,请执行以下操作:

http://localhost:9002/projectName/doSomething

然后在我的ReceiveCallBack方法中,收到的数据是:

POST /projectName/doSomething HTTP/ 1.1
Accept: * / *
Origin: http://localhost
Accept-Language: tr-TR
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko
Host: localhost:9002

但是,如果他们通过https网址发送请求,您可以在下面看到:

https://localhost:9002/projectName/doSomething

然后收到的数据类似于:

\0?\0\0?U:vv?W?????????T??k#?=??? v\tci\0\0,?(?'??\0=\0<\05\

我尝试使用UTF8编码以可读格式转换此数据并通过Internet搜索但我找不到解决方案。

通过HTTPS请求接收可读数据的方式是什么?

由于

2 个答案:

答案 0 :(得分:1)

您可能正在看https第一轮握手协议。在https中,两台计算机通过多步握手来协商要使用的加密,交换公钥等。即使您通过握手阶段,数据也会被加密(这有点使用https)。 / p>

答案 1 :(得分:1)

我实际上已经从套接字编写了一个Web服务器和SOAP堆栈,而不使用任何WCF或HttpListener,并且必须处理添加https支持。代码实际上相对简单。

您需要首先通过SslStream适配器从Socket构建NetworkStream

var sslStream = new SslStream(new NetworkStream(socket));

然后是困难的部分:您需要AuthenticateAsServer,这需要您从连接客户端信任的发布者那里获得X509Certificate 和相应的私钥,其中包含主题名称与https URL的主机部分匹配。 (这是困难的部分,因为除非你拥有连接的两面,否则你不能用它编写代码 - 这就是浏览器之类的客户端如何知道网站是否合法。)

sslStream.AuthenticateAsServer(serverCertificate);

最后,您可以从sslStream读取并获取实际的未加密的HTTP请求。