HttpListener 仅支持 localhost 的 SSL?

编程


你好,

我想很多人都知道并使用过 Http监听器[^] 班级。

据我从 MSDN 上的说明可以看到它支持 https 流量:

If you create an HttpListener using https, you must select a Server Certificate for that listener. Otherwise, an HttpWebRequest query of this HttpListener will fail with an unexpected close of the connection.

我将根证书添加到本地存储中的受信任证书中,并在本地存储中添加了一个由根证书签名的个人证书:

ROOT
makecert.exe -sr localmachine -ss MY -a sha1 -n "CN=Root,O=DO_NOT_TRUST,OU=test purposes" -sky signature -pe -r "Root.cer" -sv "RootKey.pvk"

Personal
makecert.exe -sr localmachine -ss MY -a sha1 -n "CN=*.codeproject.com,O=DO_NOT_TRUST,OU=test purposes" -sky exchange -pe -ir localmachine  -iv "RootKey.pvk" -ic "Root.cer"

我将证书绑定到端口,如下所示:

netsh http add sslcert ipport=0.0.0.0:8081 certhash="{hash}" appid={guid}

一切正常,但仅限于本地主机上的网站。 当我尝试打开例如 https://codeproject.com 时。 HttpListener“听不到”请求。 浏览器尝试打开网页,但因超时而失败。

顺便说一句,我知道它被称为中间人攻击,但它仅用于测试目的,不幸的是我无法使用也使用此技术的 Fiddler。

按照传统,我的问题并不简单,我相信这里没有“免费评分”的家伙,抱歉:)但如果你能够帮助我那就太好了。

还要注意一点 – 我已经阅读了几乎所有关于此的文章以及 localhost 的所有示例。 因此,如果您要向我提供一篇文章的链接,请检查该示例是否也适用于 localhost ;)

还有一个 – 可能您的建议是使用 TcpListner 或类似的东西。 现在我不想改变逻辑,如果它只是解决方案,我会改变逻辑。

多谢。 帖木儿。

解决方案1

惊人的! 像往常一样,超过 50 次浏览,没有答案:) 像往常一样,我自己回答。

HttpListener 是比 TCPListener 更高级的类。 当然,这意味着使用 HttpListener 更容易,但是! 这也意味着缺乏功能。 我的意思是你无法使用 HTTPListener 构建严格的代理。

正如我们所知,要使用安全套接字 (SSL),我们需要进行 SSL 握手(CONNECT 方法等)。 但对于 HttpListener,应该通过证书绑定来完成(netsh http add sslcert)。 我只能说,我尝试了一切,但无法为远程主机工作,只能为本地主机工作。 我不知道原因,抱歉。
其次,这种证书投标在代理方面使用起来并不舒服。 如果我想即时创建具有正确 CN 主题的证书该怎么办?

所有这些使我重写我的应用程序以使用 TCPListener 并处理 CONNECT 方法。

以下文章帮助我了解基础知识:
用 C# 实现多线程 HTTP/HTTPS 调试代理服务器[^]

解决方案6

回答永远不会太晚?

当尝试将 HttpListener 用于 localhost 以外的任何内容时,需要保留 URL。 其语法如下:

netsh http add urlacl url=http://<hostName>:<port>/ user=<user>

其中 : 是 HttpListener 的端点, 是将记录 URL 预留的用户 ID 或用户组名称。

使用以下语法删除预留:

netsh http delete urlacl url=http://<hostName>:<port>/

コメント

タイトルとURLをコピーしました