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,защищены pswd pks частная и т. д.).. Есть ли предпочтительный формат, который я должен использовать?

Только Я получить сертификат в доверенное хранилище, мне нужно привязать его к TCP-порту. Я на Win7: должен ли я использовать httpcfg или netsh?

любые советы / советы будут оценены.

3 ответов


Я сделал кучу домашних заданий и получил эту работу. Шаги для добавления поддержки SSL для .NET HttpListener:

  1. Обновить код приложения C#, чтобы включить префикс https. Пример

    String[] prefixes = { "http://*:8089/","https://*:8443/" };
    

    это с точки зрения кода.

  2. для стороны сертификата вещей, используя консоль команды 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. Он включает в себя множество ссылок, если вы хотите провести дальнейшие исследования.

  1. создайте автономный сервер в .NET via HttpListener:

    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();
    
  2. создать самозаверяющий сертификат:*

    1. openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365, который подскажет вам значение каждого из полей сертификата в командной строке. Для общего имени, введите имя домена (например,localhost)
    2. openssl pkcs12 -inkey bob_key.pem -in bob_cert.cert -export -out bob_pfx.pfx, так, что его можно импортировать со своим ключом на машине цели.

    *для альтернативного использования makecert, см. собственный Уолтера ответ.

  3. Откройте Диспетчер сертификатов для локального компьютера. При запуске certmgr.msc, он открывает Диспетчер сертификатов для настоящее, чего мы здесь не хотим. Вместо этого:

    1. из административной командной строки на целевой машине запустите mmc
    2. пресс Ctrl + M, или нажмите кнопку > добавить/удалить оснастку
    3. выбрать Certificates и нажмите кнопку добавить >
    4. в появившемся диалоговом окне выберите Computer Account и нажмите кнопку далее
    5. выбрать Local Computer. Нажмите готово, потом ОК
  4. импорт сертификата (pfx) в Хранилище Сертификатов Windows на цели машина!--34-->

    1. на mmc окно ранее открыто, перейдите к Сертификаты (Локальный Компьютер)>персональный
    2. Правой Кнопкой Мыши на Personal, затем нажмите Все Задачи ->импорт...
    3. на 2-м экране диалогового окна, которое появляется, найти и импортировать сертификат. Вам придется изменить фильтр типа файла на Personal Information Exchange или All Files in чтобы найти его
    4. на следующем экране введите пароль, выбранный на шаге 2.1, и обратите пристальное внимание на первый флажок. Это определяет, насколько надежно хранится ваш сертификат, а также насколько удобно его использовать
    5. на последнем экране, выберите Place all certificates in the following store. Убедитесь, что он говорит Personal, нажмите кнопку готово
    6. повторите процедуру импорта для Trusted Root Certification Authorities сертификаты раздел.
  5. создайте ассоциации портов для вашего приложения. В 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 здесь.

  6. начать свой веб-сервер, и вы хорошо идти!


поскольку создание собственных самозаверяющих сертификатов в ответах не сработало для меня, и поскольку вопрос конкретно требует создания .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 путь:

  1. установите IIS (через функции windows on / of), создайте веб-сайт в IIS и назначьте имя хоста. Также сделать безопасный сайт (порт 443) его.
  2. запустите letsencrypt-win-simple exe (я использовал версию 1.9.1). Ответьте на вопросы, чтобы позволить ему генерировать сертификат.
  3. после этого вы можете остановить сервер IIS.

Я считаю, что вы должны принять к сведению задачу обновления, поскольку я не уверен, что это удастся после нескольких месяцы (вероятно, вам придется снова запустить IIS для обновления сертификата).