TimGameDev Ответов: 1

HttpListener поддерживает SSL только для localhost?


Привет,

Я думаю, что многие люди знают и используют Прослушиватель httplistener[^] класс.

Насколько я вижу из заметки на 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.


Я добавил корневой сертификат к доверенному в localstorage и еще один сертификат к личному также в localstorage который подписан корневым сертификатом:
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}


И все работает, но только для сайтов на localhost. Когда я пытаюсь открыть например https://codeproject.com. HttpListener "не слышит" запрос. Браузер пытается открыть веб-страницу и терпит неудачу с таймаутом.

Кстати, я знаю, что это называется атакой типа man-in-the-middle, но это только для тестовых целей, и, к сожалению, я не могу использовать Fiddler, который также использует эту технику.

По традиции мой вопрос не простой, я считаю, что здесь нет "свободного рейтинга" ребят, извините :) но если вы сможете мне помочь, это будет здорово.

Еще одно замечание - я прочитал почти все статьи об этом и все примеры для localhost там. Так что если вы собираетесь предоставить мне ссылку на статью пожалуйста проверьте это может быть этот пример также для localhost ;)

И еще одно - возможно, вашим предложением будет использование TcpListner или что-то в этом роде. На данный момент я не хочу менять логику, я изменю логику, если это только решение.

Большое спасибо. Тимур.

1 Ответов

Рейтинг:
4

TimGameDev

Удивительно! более 50 просмотров и никаких ответов, как обычно :) Отвечаю сам, как обычно.

HttpListener-это более высокоуровневый класс, чем TCPListener. Конечно это означает что с HttpListener проще работать но! это также означает, что там отсутствует функциональность. Я имею в виду, что вы не можете построить серьезный прокси-сервер с HTTPListener.

Как мы знаем, чтобы работать с защищенным сокетом (SSL), нам нужно сделать SSL handshake (метод подключения и так далее). Но для HttpListener это должно быть сделано через привязку сертификата (netsh http add sslcert). Все, что я могу сказать, это то, что я перепробовал все и не смог бы сделать это для удаленного хоста, только для локального хоста. Я не знаю причины, извините.
Далее, этот сертификат выжидания не удобен в использовании с точки зрения прокси-сервера. Что делать, если я хочу создавать сертификаты на лету с правильной темой CN?

Все это заставило меня переписать свое приложение, чтобы использовать TCPListener и обрабатывать методы CONNECT.

Следующая статья поможет мне понять основы:
Реализация многопоточного прокси-сервера отладки HTTP/HTTPS на языке C#[^]


NeptuneHACK!

Ну, мои 5

TimGameDev

Спасибо!