Jak přidám SSL aplikace .NET, který používá httplistener - bude to * není * být spuštěna na serveru IIS

hlasů
37

Nejnovější úpravy tučně jsem pomocí rozhraní .NET HttpListenertřídy, ale já nebude spuštěn na serveru IIS a nejsem pomocí ASP.NET. Tato webová stránka popisuje, co kód skutečného použití implementovat SSL s ASP.NET a toto místo popisuje, jak nastavit certifikáty (i když si nejsem jistý, jestli to funguje pouze pro IIS, či nikoli).

Dokumentace třídy popisuje různé typy ověřování (základní, digest, Windows, atd.) --- žádný z nich se týkají SSL. Neznamená to říci, že pokud se používá HTTPS, budete muset nastavit certifikát serveru . Je to bude nastavení jeden řádek majetku a HttpListenervyřeší zbytek?

Stručně řečeno, musím vědět, jak nastavit certifikáty a jak upravit kód pro implementaci SSL.

Ačkoli to nenastane, když se snažím o přístup HTTPS, Všiml jsem si chybu v mém protokolu událostí systému - je zdrojem „Schannel“ a obsah zprávy je:

Při pokusu o přístup k serveru SSL pověření soukromého klíče došlo k závažné chybě. Kód chyby vrácený z kryptografického modulu je 0x80090016.

Edit:
Kroky dosud přijatá

  • Vytvořila pracovní HTTPListener v jazyce C #, který pracuje pro připojení HTTP (například http: // localhost: 8089 / foldername /
  • Vytvořili certifikátu pomocí makecert.exe
  • Přidán certifikát musí být důvěryhodný pomocí certmgr.exe
  • Používá se Httpcfg.exe naslouchat pro připojení SSL na testovací port (např 8090)
  • Přidán port 8080 na HTTPListener přes listener.Prefixes.Add ( https: // localhost: 8090 / foldername / „);
  • testován připojení HTTP klienta, např ( http: // localhost: 8089 / foldername / „) v prohlížeči a přijímat správný návrat
  • testován připojení HTTPS klienta, např ( http: // localhost: 8090 / foldername / „) v prohlížeči a přijímat Přenos dat Přerušený(ve Firefoxu)
  • ladění v Visual Studio ukazuje, že posluchač zpětné volání, který přijímá požadavky nikdy nedostane zasažen při spuštění připojení HTTPS - Nevidím žádné místo, které bych mohl nastavit zarážku chytit něco jiného dříve.
  • netstat ukazuje, že naslouchající porty jsou otevřeny pro obě HTTPS a HTTP. HTTPS portu nemá jít do TIME_WAIT po připojení se pokusil.
  • Šumař a HTTPAnalyzer nezachytily žádné z provozu, myslím, že to není dost daleko v procesu se ukázat v těchto analytických nástrojů HTTP

otázky

  • Co může být problém?
  • Je tam kus .NET kód jsem chybí (to znamená jsem dělat víc v jiném jazyce C #, než jen přidat předponu na posluchače, který odkazuje na HTTPS, což je to, co jsem udělal)
  • Už to promarněná konfigurační krok někde?
  • Co jiného bych mohl udělat pro analýzu problému?
  • Je chybová zpráva v protokolu událostí systému znamení problému? Pokud ano, jak by se to vyřešit?
Položena 06/08/2008 v 22:18
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
9

Mám podobný problém, a zdá se, že by mohl být problém s certifikátem sám.

Tady je cesta, která pracovala pro mě:

makecert.exe -r -a sha1 -n CN=localhost -sky exchange -pe -b 01/01/2000 -e 01/01/2050 -ss my -sr localmachine

pak vyhledat certifikát Miniatura , zkopírovat do schránky a odstranit mezery. Bude to parametr po -h v následujícím příkazem:

HttpCfg.exe set ssl -i 0.0.0.0:801 -h 35c65fd4853f49552471d2226e03dd10b7a11755

spustit celou řadu služby na https: // localhost: 801 / a funguje to perfektně.

co nemůžu dělat práci, je pro https běžet automaticky generovaný certifikát. Zde je kód, který jsem běžet pro generování jednoho (zpracování chyb vyřazena kvůli přehlednosti):

LPCTSTR pszX500 = subject;
DWORD cbEncoded = 0;
CertStrToName(X509_ASN_ENCODING, pszX500, CERT_X500_NAME_STR, NULL, pbEncoded, &cbEncoded, NULL);
pbEncoded = (BYTE *)malloc(cbEncoded);
CertStrToName(X509_ASN_ENCODING, pszX500, CERT_X500_NAME_STR, NULL, pbEncoded, &cbEncoded, NULL);

// Prepare certificate Subject for self-signed certificate
CERT_NAME_BLOB SubjectIssuerBlob;
memset(&SubjectIssuerBlob, 0, sizeof(SubjectIssuerBlob));
SubjectIssuerBlob.cbData = cbEncoded;
SubjectIssuerBlob.pbData = pbEncoded;

// Prepare key provider structure for self-signed certificate
CRYPT_KEY_PROV_INFO KeyProvInfo;
memset(&KeyProvInfo, 0, sizeof(KeyProvInfo));
KeyProvInfo.pwszContainerName = _T("my-container");
KeyProvInfo.pwszProvName = NULL;
KeyProvInfo.dwProvType = PROV_RSA_FULL;
KeyProvInfo.dwFlags = CRYPT_MACHINE_KEYSET;
KeyProvInfo.cProvParam = 0;
KeyProvInfo.rgProvParam = NULL;
KeyProvInfo.dwKeySpec = AT_SIGNATURE;

// Prepare algorithm structure for self-signed certificate
CRYPT_ALGORITHM_IDENTIFIER SignatureAlgorithm;
memset(&SignatureAlgorithm, 0, sizeof(SignatureAlgorithm));
SignatureAlgorithm.pszObjId = szOID_RSA_SHA1RSA;

// Prepare Expiration date for self-signed certificate
SYSTEMTIME EndTime;
GetSystemTime(&EndTime);
EndTime.wYear += 5;

// Create self-signed certificate
pCertContext = CertCreateSelfSignCertificate(NULL, &SubjectIssuerBlob, 0, &KeyProvInfo, &SignatureAlgorithm, 0, &EndTime, 0);
hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_LOCAL_MACHINE, L"MY");
CertAddCertificateContextToStore(hStore, pCertContext, CERT_STORE_ADD_REPLACE_EXISTING, 0);

Certifikát ukazuje v pořádku a má pracovní soukromý klíč, ale https bude časový limit, jako by otisk nebyl nikdy registrován. Jestli někdo ví proč - plz komentář

Edit1 : Po nějakém pohrával jsem zjistil, inicializace pro CertCreateSelfSignCertificate který generuje správný certifikát:

CRYPT_KEY_PROV_INFO KeyProvInfo;
memset(&KeyProvInfo, 0, sizeof(KeyProvInfo));
KeyProvInfo.pwszContainerName = _T("my-container");
KeyProvInfo.pwszProvName = _T("Microsoft RSA SChannel Cryptographic Provider");
KeyProvInfo.dwProvType = PROV_RSA_SCHANNEL;
KeyProvInfo.dwFlags = CRYPT_MACHINE_KEYSET;
KeyProvInfo.cProvParam = 0;
KeyProvInfo.rgProvParam = NULL;
KeyProvInfo.dwKeySpec = AT_KEYEXCHANGE;
Odpovězeno 07/04/2009 v 22:15
zdroj uživatelem

hlasů
7

Jen budete muset svázat certifikát IP: port a pak otevřít posluchače s https: // prefix. 0.0.0.0 se vztahuje na všechny IP adres. AppID je nějaký náhodný GUID a certhash je hash certifikátu (někdy nazývané thumprint).

Spusťte následující s cmd.exe s využitím oprávnění správce.

netsh http add sslcert ipport=0.0.0.0:1234 certhash=613bb67c4acaab06def391680505bae2ced4053b  appid={86476d42-f4f3-48f5-9367-ff60f2ed2cdc}

Chcete-li vytvořit certifikát s vlastním podpisem, aby tento test,

  1. otevřené IIS
  2. Kliknutím na jméno počítače
  3. Klikněte na ikonu serverové certifikáty
  4. Kliknutím na tlačítko vygenerovat self-signed certifikátu
  5. Dvojitým kliknutím a jít do detailů
  6. Uvidíte miniaturu tam, stačí odstranit mezery.

    HttpListener listener = new HttpListener();
    listener.Prefixes.Add("https://+:1234/");
    listener.Start();
    Console.WriteLine("Listening...");
    HttpListenerContext context = listener.GetContext();
    
    using (Stream stream = context.Response.OutputStream)
    using (StreamWriter writer = new StreamWriter(stream))
        writer.Write("hello, https world");
    
    Console.ReadLine();
    

Po spuštění tohoto programu jsem prostě přešli https://localhost:1234vidět text vytištěn. Vzhledem k tomu, certifikát CN neodpovídá URL a není v úložišti důvěryhodných certifikátů dostanete varování o certifikát. V textu je zašifrován ale jak si můžete ověřit pomocí nástroje jako Wireshark.

Pokud si chcete zachovat větší kontrolu nad vytvořením x509 certifikát openssl self-signed je skvělý nástroj a tam je port pro Windows. Měl jsem mnohem větší úspěch, než nástrojem makecert.


Je také velmi důležité, aby v případě, že komunikace s služba HTTPS z kódu, který má s varováním protokolu SSL, musíte nastavit certifikát validátor na manažerovi bod služby obejít to pro účely testování.

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, errors) => true;
Odpovězeno 29/09/2012 v 04:55
zdroj uživatelem

hlasů
6

Nemám přece úplně realizován, ale tato webová stránka se zdá dát dobrý návod na zřízení osvědčení a kód.

Odpovězeno 06/08/2008 v 23:29
zdroj uživatelem

hlasů
4

Zde je alternativní způsob, jak vázat SSL certifiate ke kombinaci IP / PORT bez použití httpcfg.exe(XP) nebo netsh.exe(Vista +).

http://dotnetcodebox.blogspot.com.au/2012/01/how-to-work-with-ssl-certificate.html

Podstatou je, že můžete použít C ++ HttpSetServiceConfiguration API vestavěné do oken, aby to programově, spíše než přes příkazový řádek, tedy odstranění závislosti na operačním systému a má httpcfg nainstalován.

Odpovězeno 02/03/2015 v 05:14
zdroj uživatelem

hlasů
3

Dokumentace Třída

má tuto poznámku:

Pokud vytvoříte HttpListener pomocí protokolu https, musíte vybrat certifikátu serveru pro tento posluchače. V opačném případě HttpWebRequest dotaz tohoto HttpListener se nezdaří s nečekaným ukončení spojení.

a tohle:

Můžete konfigurovat certifikáty serveru a další možnosti posluchačů pomocí HttpCfg.exe. Viz http://msdn.microsoft.com/library/default.asp?url=/library/en-us/http/http/httpcfg_exe.asp pro více informací. Spustitelný soubor je dodáván se systémem Windows Server 2003, nebo mohou být postaveny ze zdrojového kódu k dispozici v sadě Platform SDK.

Je první zmínka vysvětlit druhým? Jak je uvedeno v otázce, jsem Httpcfg.exe svázat certifikát k určitému portu. Pokud mají v úmyslu něco jiného než to, poznámka je nejednoznačný.

Odpovězeno 08/08/2008 v 17:37
zdroj uživatelem

hlasů
2

Jsem narazil na stejný problém jako vy. Naštěstí po googling tvrdé kroky na této stránce , aby SSL pracovat s mým HttpListener.

Odpovězeno 28/01/2009 v 11:22
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more