Вопрос по x509certificate, .net, httplistener – Httplistener с поддержкой https

53

Кажется, много запутанной, иногда противоречивой информации о том, как сделать .net HTTPListener https способным. Мое понимание таково:

One's c# code needs an https prefix (ex. https://*:8443) in order for the listener to understand that it needs to service SSL requests at this port.

The actual SSL handshake happens under the covers and is handled by http.sys (buried somewhere on the Windows machine); The C# code doesn't have to explicitly manage the ssl handshake, because it happens under the covers.

One needs to have a "x509 trusted certificate" on the httpListener machine, and somehow that certificate needs to be bound to port 8443 (in this example)

Правильно ли мое понимание выше? Если нет, пожалуйста, просветите меня.

Что касается сертификатов x509, я понимаю следующее:

Use makecert to create a x509 certificate. This certificate gets stored in the personal store and needs to get moved over to the Trusted Store (this is where the http listener will look). Seems I can use certMgr to perform the move, or I can use mmc to effect the move. Seems there is more than 1 x509 cert format (DER,Base64,pks,pswd protected pks private etc).. Is there a preferred format I should use?

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

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

Ваш Ответ

2   ответа
73

ия поддержки SSL для .NET HttpListener:

Update C# app code to include https prefix. Example

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

That's it from the code aspect.

For the certificate side of things, using Win SDK command console (can also use VS Professional command console)

Use makecert.exe to create a certificate authority. Example:

makecert -n "CN=vMargeCA" -r -sv vMargeCA.pvk vMargeCA.cer

Use makecert.exe to create an SSL certificate

makecert -sk vMargeSignedByCA -iv vMargeCA.pvk -n "CN=vMargeSignedByCA" -ic vMargeCA.cer vMargeSignedByCA.cer -sr localmachine -ss My

Use MMC GUI to install CA in Trusted Authority store

Use MMC GUI to install ssl cert in Personal store

Bind certificate to ip:port and application. Example:

netsh http add sslcert ipport=0.0.0.0:8443 certhash=585947f104b5bce53239f02d1c6fed06832f47dc appid={df8c8073-5a4b-4810-b469-5975a9c95230}

The certhash is the thumbprint from your ssl certificate. you can find this using mmc The appid is found in VS...usually in assembly.cs, look for guid value

Могут быть и другие способы выполнения вышесказанного, но это сработало для меня.

Да, я попытался сделать все в соответствии с этими подсказками, но я не могу пройти через последний шаг - он говорит, что какой-то параметр недействителен ...
@WalterKelt Ваш ответ мне очень помог и заполнил почти все пробелы в существующей документации. Тем не менее, я должен был заполнить некоторые из них, поэтому я опубликовал свой пошаговый процесс в качестве ответа. Ура!
Есть ли способ связать сертификат корневого ЦС с промежуточным сертификатом?
@WalterKelt просто предположение, но, вероятно, Guid в вашем файле AssemblyInfo в папке свойств исполняемого проекта
Я заметил, когда я копирую и вставляю в командную строку, что иногда "?" появляется между & quot; certhash = & quot; и фактический ключ. Дважды проверьте ваш ввод.
27

которые я выполнил, чтобы настроить автономный сервер в Windows, используяopenssl создать самоподписанный сертификат дляC# HTTPListener приложение. Он включает в себя множество ссылок, на случай, если вы хотите провести дальнейшее исследование.

Create a stand-alone server in .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();

Create self-signed certificate:*

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365, which will prompt you for the value of each of the certificate's fields on the command line. For the common name, type the domain name (e.g. localhost) openssl pkcs12 -inkey bob_key.pem -in bob_cert.cert -export -out bob_pfx.pfx, so that it can be imported with its key on the target machine.

*For an alternative using makecert, see Walter's own answer.

Open Certificate Manager for the Local Machine. When you run certmgr.msc, it opens the Certificate Manager for the current user, which is not what we want here. Instead:

From an administrative command prompt on the target machine, run mmc Press Ctrl + M, or Click File > Add/Remove Snap-in Choose Certificates, and click Add > In the dialog that appears, Choose Computer Account, and click Next Choose Local Computer. Click Finish, then Okay

Import the certificate (pfx) into the Windows Certificate Store on the target machine

In the mmc window previously opened, drill down to Certificates (Local Computer) > Personal Right-click on Personal, then click on All Tasks -> Import... In the 2nd screen of the dialog that appears, find and import your certificate. You'll have to change the file-type filter to Personal Information Exchange or All Files in order to find it On the next screen, enter the password you chose in step 2.1, and pay close attention to the first check box. This determines how securely your certificate is stored, and also how convenient it is to use On the last screen, choose Place all certificates in the following store. Verify that it says Personal, then click Finish Repeat the import procedure above for the Trusted Root Certification Authorities certificates section.

Create the port associations for your application. On Windows Vista and later, use netsh, as I did. (For Windows XP and earlier, use httpcfg)

From the administrative command line, type the following to set up the SSL binding* to your app, and the appropriate port. NB: This command is easy to get wrong, because (in PowerShell) the braces need to be escaped. The following PowerShell command will work:

netsh http add sslcert ipport=0.0.0.0:8443 `
    certhash=110000000000003ed9cd0c315bbb6dc1c08da5e6 `
    appid=`{00112233-4455-6677-8899-AABBCCDDEEFF`}

For cmd.exe, the following should be used instead:

netsh http add sslcert ipport=0.0.0.0:8443 certhash=110000000000003ed9cd0c315bbb6dc1c08da5e6 appid={00112233-4455-6677-8899-AABBCCDDEEFF}
The ipport parameter will cause the ssl cert to bind to the port 8443 on every network interface; to bind to a specific interface (only), choose the IP address associated with that network interface. The certhash is simply the certificate thumbprint, with spaces removed The appid is the GUID stored in the Assembly Info of your application. (Sidenote: The netsh mechanism is evidently a COM interface, judging from this question and its answers)

* Microsoft has redirected the SSL Binding link from here to there.

Start up your web-server, and you're good to go!

Хорошо. Спасибо за предоставление контекста для вашего редактирования.
В моей Windows команда для создания файла .pfx зависает с помощью Git- (Bash) -for-Windows. В качестве решения просто добавьтеwinpty перед командой в соответствии сopenssl-hangs-during-pkcs12-export.
@dwettstein Хороший совет! К сожалению, очень сложно (в общем) предсказать, какие команды будут работать лучшеwinpty по сравнению с без.
@Jez IIRC, у меня не было проблем с использованием толькоTrusted Root Certificate Authorities Сертифицированный магазин. Есть ли что-то особенное в вашей настройке, которое требует, чтобы сертификат был вPersonal хранить как хорошо?
Когда я побежалnetsh На компьютере, на котором я установил сертификат, я получил сообщение об ошибке «Ошибка добавления сертификата SSL, ошибка 1312 - указанный сеанс входа в систему не существует. Возможно, оно уже было прекращено. & Quot; Глядя на этот ответ на этот вопрос, похоже, что сертификат должен быть в личном хранилище, чтобы установить его черезnetsh (это говорит о бегеcertutil сmy скорее, чемroot): stackoverflow.com/a/19766650/178757

Похожие вопросы