Bagaimana cara menambahkan SSL untuk .net aplikasi yang menggunakan httplistener - akan *tidak* akan berjalan pada IIS

Terbaru suntingan di bold Saya menggunakan .net HttpListener kelas, tapi aku tidak't dapat menjalankan aplikasi ini pada IIS dan saya tidak menggunakan ASP.net. Ini situs web menjelaskan apa kode untuk benar-benar menggunakan untuk menerapkan SSL dengan asp.net dan situs menjelaskan cara mengatur sertifikat (meskipun saya'm tidak yakin jika ini bekerja hanya untuk IIS atau tidak).

Kelas dokumentasi yang menjelaskan berbagai jenis otentikasi (basic, digest, Windows, dll.) --- tidak satupun dari mereka merujuk ke SSL. Itu tidak mengatakan bahwa jika HTTPS digunakan, anda akan perlu untuk mengatur sebuah server sertifikat. Ini akan menjadi salah satu line pengaturan properti dan HttpListener angka keluar sisanya?

Singkatnya, saya perlu tahu bagaimana untuk mengatur sertifikat dan bagaimana memodifikasi kode untuk mengimplementasikan SSL.

Meskipun itu doesn't terjadi ketika saya'm mencoba untuk mengakses HTTPS, saya tidak melihat kesalahan dalam log Peristiwa Sistem - sumber "Schannel" dan isi pesan adalah:

terjadi kesalahan fatal saat mencoba untuk mengakses server SSL credential kunci privat. Kode kesalahan kembali dari modul kriptografi adalah 0x80090016.

Edit: Langkah-langkah yang diambil sejauh ini

  • Menciptakan kerja HTTPListener di C# yang bekerja untuk koneksi HTTP (misalnya "http://localhost:8089/foldername/"
  • Membuat sertifikat menggunakan makecert.exe
  • Menambahkan sertifikat dapat dipercaya menggunakan certmgr.exe
  • Digunakan Httpcfg.exe untuk mendengarkan untuk koneksi SSL pada tes port (misalnya 8090)
  • Menambahkan port 8080 untuk HTTPListener via pendengar.Prefiks.Tambahkan(https://localhost:8090/foldername/");
  • diuji HTTP client koneksi, misalnya (http://localhost:8089/foldername/") di browser dan menerima benar kembali
  • diuji HTTPS koneksi klien, misalnya (http://localhost:8090/foldername/") di browser dan menerima "Transfer Data Terganggu" (di Firefox)
  • debugging di visual studio menunjukkan bahwa pendengar callback yang menerima permintaan tidak pernah menjadi hit ketika koneksi HTTPS dimulai - I don't melihat setiap tempat yang aku bisa mengatur breakpoint untuk menangkap apa pun sebelumnya.
  • netstat menunjukkan bahwa mendengarkan port yang terbuka untuk investasi HTTPS dan HTTP. port HTTPS tidak pergi ke TIME_WAIT setelah sambungan berusaha.
  • Fiddler dan HTTPAnalyzer don't menangkap semua lalu lintas, saya kira itu doesn't mendapatkan cukup jauh dalam proses untuk menunjukkan di HTTP alat analisis

Pertanyaan ****

  • Apa yang bisa menjadi masalah?
  • Apakah ada sepotong .Kode bersih saya hilang (artinya saya harus berbuat lebih banyak di C# lain daripada hanya menambahkan awalan ke pendengar yang menunjuk ke HTTPS, yang adalah apa yang telah saya lakukan)
  • Memiliki melewatkan langkah konfigurasi di suatu tempat?
  • Apa lagi yang bisa saya lakukan untuk menganalisis masalah?
  • Adalah pesan error di log Peristiwa Sistem tanda dari masalah? Jika begitu bagaimana hal itu akan diperbaiki?

Saya memiliki masalah yang sama, dan tampaknya bahwa mungkin ada masalah dengan sertifikat itu sendiri.

Berikut ini's path yang bekerja untuk saya:

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

kemudian melihat ke atas sertifikat cap jempol, salin ke clipboard dan menghapus spasi. Ini akan menjadi parameter setelah -jam di depan perintah:

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

kemudian jalankan layanan host pada https://localhost:801 dan itu bekerja dengan sempurna.

apa yang saya tidak bisa membuat pekerjaan https untuk berjalan pada self-generated sertifikat. Berikut ini's kode yang saya jalankan untuk menghasilkan satu (penanganan kesalahan dibawa keluar untuk kejelasan):

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);

Sertifikat menunjukkan baik-baik saja dan itu telah bekerja sebuah kunci pribadi, tetapi https akan timeout seolah-olah cap jempol itu tidak pernah terdaftar. Jika ada yang tahu mengapa - plz komentar

EDIT1: Setelah beberapa bermain-main, saya telah menemukan inisialisasi untuk CertCreateSelfSignCertificate yang menghasilkan tepat sertifikat:

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;
Komentar (0)

Anda hanya perlu mengikat sertifikat ke ip:port dan kemudian buka pendengar anda dengan https:// awalan. 0.0.0.0 berlaku untuk semua ip's. appid acak GUID, dan certhash adalah hash dari sertifikat (kadang-kadang disebut thumprint).

Jalankan berikut dengan cmd.exe menggunakan hak administrator.

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

Jika anda ingin membuat self-signed untuk tes ini,

  1. Buka IIS
  2. Klik pada nama komputer anda
  3. Klik Sertifikat Server icon
  4. Klik menghasilkan Self-Signed certificate
  5. Double klik dan pergi ke rincian
  6. Anda akan melihat cap jempol yang ada, hanya menghapus spasi.

HttpListener pendengar = new HttpListener(); pendengar.Prefiks.Tambahkan("https://+:1234/"); pendengar.Start(); Konsol.WriteLine("Mendengarkan..."); HttpListenerContext konteks = pendengar.GetContext();

menggunakan (Stream stream = konteks.Respon.OutputStream) menggunakan (StreamWriter writer = new StreamWriter(stream)) penulis.Write("hello, https dunia");

Konsol.ReadLine();

Setelah menjalankan program ini saya hanya berlayar ke https://localhost:1234 untuk melihat teks yang dicetak. Sejak sertifikat CN tidak cocok url dan itu tidak ada dalam Sertifikat Terpercaya toko anda akan mendapatkan surat Peringatan. Teks dienkripsi namun seperti yang anda dapat memverifikasi dengan alat seperti Wire Shark.

Jika anda ingin lebih banyak kontrol atas membuat self-signed x 509 sertifikat openssl adalah alat yang hebat dan ada port untuk windows. I've memiliki lebih banyak keberhasilan dengan itu dari makecert alat.


It's juga sangat penting bahwa jika anda berkomunikasi dengan https layanan dari kode yang telah peringatan ssl, anda harus setup sertifikat validator pada service point manager untuk memotong itu untuk tujuan pengujian.

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, errors) => true;
Komentar (0)

Saya don't memiliki itu sama sekali belum dilaksanakan, tapi situs web ini tampaknya untuk memberikan baik walkthrough menyiapkan sertifikat dan kode.

Komentar (0)

Berikut ini adalah cara alternatif untuk mengikat SSL certifiate untuk IP/PORT kombinasi tanpa menggunakan httpcfg.exe (XP) atau netsh.exe (Vista+).

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

Inti dari itu adalah bahwa anda dapat menggunakan C++ [HttpSetServiceConfiguration][2] API di-dibangun ke dalam windows untuk melakukannya secara programatik daripada melalui command line, oleh karena itu menghilangkan ketergantungan pada OS dan memiliki httpcfg diinstal.

[2]: https://msdn.microsoft.com/en-us/library/windows/desktop/aa364503(v=vs. 85).aspx

Komentar (1)

Kelas dokumentasi

memiliki catatan ini:

Jika anda membuat sebuah HttpListener menggunakan https, anda harus memilih Server Sertifikat untuk pendengar. Jika tidak, HttpWebRequest query ini HttpListener akan gagal dengan tak terduga dekat sambungan.

dan ini:

Anda dapat mengkonfigurasi Server Sertifikat dan lainnya pendengar pilihan dengan menggunakan HttpCfg.exe. Lihat http://msdn.microsoft.com/library/default.asp?url=/library/en-us/http/http/httpcfg_exe.asp untuk rincian lebih lanjut. Eksekusi disertakan dengan Windows Server 2003, atau dapat dibangun dari kode sumber tersedia di Platform SDK.

Ini adalah catatan pertama yang dijelaskan oleh kedua? Seperti diuraikan dalam pertanyaan, saya digunakan httpcfg.exe untuk mengikat sertifikat untuk port-port tertentu. Jika mereka berniat sesuatu yang lain dari ini, catatan yang ambigu.

Komentar (0)

I've mengalami masalah yang sama seperti anda. Untungnya setelah googling keras langkah-langkah di halaman ini membuat SSL bekerja dengan saya HttpListener.

Komentar (0)