Httplistener с поддержкой https
кажется, что много запутанной, иногда противоречивой информации о том, чтобы сделать .net HTTPListener https способным. Мое понимание таково:--14-->
один код c# нуждается в
https
префикс (ex.https://*:8443
) для того, чтобы слушатель понял, что ему нужно обслуживать SSL-запросы в этом порту.фактическое рукопожатие SSL происходит под крышками и обрабатывается
http.sys
(похоронен где-то на Windows machine); код C# не должен явно управлять ssl-рукопожатием, потому что это происходит под одеялом.нужно иметь "доверенный сертификат x509" на
httpListener
машина, и каким-то образом этот сертификат должен быть привязан к порту 8443 (в этом примере)
правильно ли мое понимание выше? Если нет, пожалуйста, просветите меня.
относительно сертификатов x509, мое понимание есть:
- использовать
makecert
для создания сертификата x509. Этот сертификат хранится в личном хранилище и должен быть перемещен в доверенное хранилище (здесь будет искать прослушиватель http). Кажется, я могу использоватьcertMgr
для выполнения перемещения, или я могу использоватьmmc
для осуществления переезда. Кажется, есть более чем 1 x509 формат сертификата (DER
,Base64
,pks
,защищены pswdpks
частная и т. д.).. Есть ли предпочтительный формат, который я должен использовать?
Только Я получить сертификат в доверенное хранилище, мне нужно привязать его к TCP-порту. Я на Win7: должен ли я использовать httpcfg
или netsh
?
любые советы / советы будут оценены.
3 ответов
Я сделал кучу домашних заданий и получил эту работу. Шаги для добавления поддержки SSL для .NET HttpListener:
-
Обновить код приложения C#, чтобы включить префикс https. Пример
String[] prefixes = { "http://*:8089/","https://*:8443/" };
это с точки зрения кода.
-
для стороны сертификата вещей, используя консоль команды win SDK (можно также использовать VS Профессиональная командная консоль)
-
использовать
makecert.exe
для создания центра сертификации. Пример:makecert -n "CN=vMargeCA" -r -sv vMargeCA.pvk vMargeCA.cer
-
использовать
makecert.exe
для создания SSL-сертификатаmakecert -sk vMargeSignedByCA -iv vMargeCA.pvk -n "CN=vMargeSignedByCA" -ic vMargeCA.cer vMargeSignedByCA.cer -sr localmachine -ss My
используйте MMC GUI для установки CA в хранилище доверенных полномочий
- используйте MMC GUI для установки ssl-сертификата в личном магазине
-
привязать сертификат к ip: порт и приложение. Пример:
netsh http add sslcert ipport=0.0.0.0:8443 certhash=585947f104b5bce53239f02d1c6fed06832f47dc appid={df8c8073-5a4b-4810-b469-5975a9c95230}
certhash-это отпечаток пальца с вашего ssl сертификат. вы можете найти это с помощью mmc Appid находится в VS...обычно в собрании.cs, ищите значение guid
-
могут быть другие способы выполнить вышеизложенное, но это сработало для меня.
вот шаги, подробно, которые я следовал, чтобы настроить автономный сервер на Windows, используя openssl
создать самозаверяющий сертификат для C#
HTTPListener
app. Он включает в себя множество ссылок, если вы хотите провести дальнейшие исследования.
-
создайте автономный сервер в
.NET
viaHttpListener
:var prefixes = {"http://localhost:8080/app/root", "https://localhost:8443/app/root"}; var listener = new HttpListener(); foreach (string s in prefixes) listener.Prefixes.Add(s); listener.Start();
-
создать самозаверяющий сертификат:*
-
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365
, который подскажет вам значение каждого из полей сертификата в командной строке. Для общего имени, введите имя домена (например,localhost
) -
openssl pkcs12 -inkey bob_key.pem -in bob_cert.cert -export -out bob_pfx.pfx
, так, что его можно импортировать со своим ключом на машине цели.
*для альтернативного использования
makecert
, см. собственный Уолтера ответ. -
-
Откройте Диспетчер сертификатов для локального компьютера. При запуске
certmgr.msc
, он открывает Диспетчер сертификатов для настоящее, чего мы здесь не хотим. Вместо этого:- из административной командной строки на целевой машине запустите
mmc
- пресс Ctrl + M, или нажмите кнопку > добавить/удалить оснастку
- выбрать
Certificates
и нажмите кнопку добавить > - в появившемся диалоговом окне выберите
Computer Account
и нажмите кнопку далее - выбрать
Local Computer
. Нажмите готово, потом ОК
- из административной командной строки на целевой машине запустите
-
импорт сертификата (
pfx
) в Хранилище Сертификатов Windows на цели машина!--34-->- на
mmc
окно ранее открыто, перейдите к Сертификаты (Локальный Компьютер)>персональный - Правой Кнопкой Мыши на
Personal
, затем нажмите Все Задачи ->импорт... - на 2-м экране диалогового окна, которое появляется, найти и импортировать сертификат. Вам придется изменить фильтр типа файла на
Personal Information Exchange
илиAll Files
in чтобы найти его - на следующем экране введите пароль, выбранный на шаге 2.1, и обратите пристальное внимание на первый флажок. Это определяет, насколько надежно хранится ваш сертификат, а также насколько удобно его использовать
- на последнем экране, выберите
Place all certificates in the following store
. Убедитесь, что он говоритPersonal
, нажмите кнопку готово - повторите процедуру импорта для
Trusted Root Certification Authorities
сертификаты раздел.
- на
-
создайте ассоциации портов для вашего приложения. В Windows Vista и более поздних версиях используйте
netsh
, как и я. (Для Windows XP и более ранних версий используйтеhttpcfg
)-
в командной строке администратора введите следующее, Чтобы настроить привязка SSL* приложения и нужный порт. NB: команда на, потому что (в PowerShell) фигурные скобки должны быть бежал. Будет работать следующая команда PowerShell:
netsh http add sslcert ipport=0.0.0.0:8443 ` certhash=110000000000003ed9cd0c315bbb6dc1c08da5e6 ` appid=`{00112233-4455-6677-8899-AABBCCDDEEFF`}
на
cmd.exe
, вместо этого следует использовать следующее:netsh http add sslcert ipport=0.0.0.0:8443 certhash=110000000000003ed9cd0c315bbb6dc1c08da5e6 appid={00112233-4455-6677-8899-AABBCCDDEEFF}
- на
ipport
параметр вызовет ssl-сертификат для привязки к порту8443
на каждом сетевом интерфейсе; для привязки к определенному интерфейсу (только) выберите IP-адрес, связанный с этим сетевым интерфейсом. - на
certhash
- это просто сертификат отпечаток большого пальца с удаленными пробелами - на
appid
- это идентификатор GUID, хранящийся в информации о сборке вашего приложения. (Заметка На Полях: Оnetsh
механизм, очевидно, является com-интерфейсом, судя по этому вопрос и его ответы)
* Microsoft перенаправила привязка SSL ссылку здесь to здесь.
- на
-
начать свой веб-сервер, и вы хорошо идти!
поскольку создание собственных самозаверяющих сертификатов в ответах не сработало для меня, и поскольку вопрос конкретно требует создания .net HTTPListener https и запрашивает любые советы / советы, я хочу поделиться своим подходом.Вам нужно имя хоста, что - то вроде www.made-up.com который должен указать на ваш WAN IP (например, попросите у вашего хост-провайдера инструкции) и переслать его порт, например, 443 на ваш локальный компьютер.Не забудьте открыть входящий порт 443 в брандмауэре локального компьютера машина.
Я использовал https://letsencrypt.org/. В windows это не так просто, как в Linux, потому что нет официального клиента certbot ACME для windows. Однако вы можете использоватьhttps://github.com/Lone-Coder/letsencrypt-win-simple, из которых есть также двоичные файлы вокруг. Однако"в настоящее время поддерживается только IIS". Но вы можете легко обмануть его, чтобы создать сертификат на вашем компьютере, чтобы вы могли подойти к httplistener SSL путь:
- установите IIS (через функции windows on / of), создайте веб-сайт в IIS и назначьте имя хоста. Также сделать безопасный сайт (порт 443) его.
- запустите letsencrypt-win-simple exe (я использовал версию 1.9.1). Ответьте на вопросы, чтобы позволить ему генерировать сертификат.
- после этого вы можете остановить сервер IIS.
Я считаю, что вы должны принять к сведению задачу обновления, поскольку я не уверен, что это удастся после нескольких месяцы (вероятно, вам придется снова запустить IIS для обновления сертификата).