Httplistener с поддержкой https


кажется, что много запутанной, иногда противоречивой, информации в отношении создания httplistener https .NET способен. Мое понимание таково:

  • один код c# нуждается в https префикс (исх. 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 private etc).. Есть ли предпочтительный формат, который я должен использовать?

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

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

3   51   2012-07-10 01:19:38

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 для установки центра сертификации в хранилище доверенных полномочий

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

  1. создать автономный сервер в .NET через 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, или нажмите кнопку File > добавить/удалить оснастку
    3. выбрать Certificates и нажмите кнопку добавить >
    4. в открывшемся диалоговом окне, выберите Computer Account и нажмите кнопку далее
    5. выбрать Local Computer. Нажмите готово, потом ОК
  4. импорт сертификата (pfx) в Хранилище Сертификатов Windows на цели машина

    1. на mmc ранее открытое окно, перейти к Сертификаты (Локальный Компьютер)>персональный
    2. Правой Кнопкой Мыши на Personal, затем нажмите Все Задачи ->импорт...
    3. во втором окне диалогового окна, которое появляется, найти и импортировать сертификат. Вам нужно будет изменить фильтр типа файла на 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* приложения и нужный порт. Примечание: команда на, потому что (in 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}
      
      • The ipport параметр приведет к привязке сертификата ssl к порту 8443 на каждом сетевом интерфейсе; для привязки к определенному интерфейсу (только) выберите IP-адрес, связанный с этим сетевым интерфейсом.
      • The certhash - это просто сертификат отпечаток пальца, с пробелами удалены
      • The appid - это идентификатор GUID, хранящийся в информации о сборке вашего приложения. (Примечание: The netsh механизм, очевидно, COM-интерфейс, судя по этому вопрос и его ответы)

      * Microsoft перенаправила привязка SSL ссылку здесь до здесь.

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

поскольку создание собственных самоподписанных сертификатов в ответах не сработало для меня, и поскольку вопрос конкретно требует создания httplistener https .net и запрашивает любые советы/советы, я хочу поделиться своим подходом.Вам нужно имя хоста, что-то вроде 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 features on/of), создайте веб-сайт в IIS и назначьте имя хоста. Также сделайте безопасный (443 порт) веб-сайт.
  2. запустите letsencrypt-win-simple exe (я использовал версию 1.9.1). Ответьте на вопросы, чтобы позволить ему генерировать сертификат.
  3. после этого вы можете остановить сервер IIS.

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