HttpListener mendukung SSL hanya untuk localhost?

pemrograman


Halo,

Saya rasa sudah banyak orang yang mengetahui dan menggunakannya HttpListener[^] kelas.

Sejauh yang saya lihat dari catatan di MSDN mendukung lalu lintas https:

If you create an HttpListener using https, you must select a Server Certificate for that listener. Otherwise, an HttpWebRequest query of this HttpListener will fail with an unexpected close of the connection.

Saya menambahkan sertifikat root ke penyimpanan lokal tepercaya dan satu sertifikat lagi ke penyimpanan pribadi juga di penyimpanan lokal yang ditandatangani oleh sertifikat root:

ROOT
makecert.exe -sr localmachine -ss MY -a sha1 -n "CN=Root,O=DO_NOT_TRUST,OU=test purposes" -sky signature -pe -r "Root.cer" -sv "RootKey.pvk"

Personal
makecert.exe -sr localmachine -ss MY -a sha1 -n "CN=*.codeproject.com,O=DO_NOT_TRUST,OU=test purposes" -sky exchange -pe -ir localmachine  -iv "RootKey.pvk" -ic "Root.cer"

Saya mengikat sertifikat ke port seperti ini:

netsh http add sslcert ipport=0.0.0.0:8081 certhash="{hash}" appid={guid}

Dan semuanya berfungsi tetapi hanya untuk situs di localhost. Ketika saya mencoba membuka misalnya https://codeproject.com. Permintaan HttpListener “tidak mendengar”. Browser mencoba membuka halaman web dan gagal dengan batas waktu.

BTW, saya tahu ini namanya serangan man-in-the-middle tapi itu hanya untuk tujuan tes dan sayangnya saya tidak bisa menggunakan Fiddler yang juga menggunakan teknik ini.

Secara tradisi, pertanyaan saya tidak sederhana, saya yakin di sini tidak ada “peringkat gratis” kawan, maaf 🙂 tetapi jika Anda dapat membantu saya, itu akan sangat bagus.

Satu catatan lagi – Saya sudah membaca hampir semua artikel tentang ini dan semua contoh untuk localhost di sana. Jadi jika Anda ingin memberi saya tautan ke sebuah artikel, silakan periksa, mungkin contoh ini juga untuk localhost 😉

Dan satu lagi – Mungkin saran Anda akan menggunakan TcpListner atau sesuatu seperti ini. Untuk saat ini saya tidak ingin mengubah logika, saya akan mengubah logika jika itu hanya solusi.

Terima kasih banyak. Timur.

Solusi 1

Luar biasa! lebih dari 50 kali dilihat dan tidak ada jawaban, seperti biasa 🙂 Menjawab sendiri, seperti biasa.

HttpListener adalah kelas tingkat lebih tinggi daripada TCPListener. Tentu saja ini berarti lebih mudah untuk bekerja dengan HttpListener tapi! ini juga berarti kurangnya fungsionalitas. Maksud saya, Anda tidak dapat membuat proxy yang serius dengan HTTPListener.

Seperti yang kita ketahui untuk bekerja dengan secure socket (SSL) kita perlu membuat SSL handshake (metode CONNECT dan seterusnya). Namun untuk HttpListener harus dilakukan melalui pengikatan sertifikat (netsh http add sslcert). Yang bisa saya katakan adalah saya mencoba segalanya dan tidak berhasil untuk host jarak jauh, hanya untuk localhost. Saya tidak tahu alasannya, maaf.
Selanjutnya, penawaran sertifikat ini tidak nyaman digunakan dalam hal proxy. Bagaimana jika saya ingin membuat sertifikat dengan cepat dengan subjek CN yang benar?

Semua ini membuat saya menulis ulang aplikasi saya untuk menggunakan TCPListener dan menangani metode CONNECT.

Artikel berikut membantu saya memahami dasar-dasarnya:
Menerapkan Server Proxy Debugging HTTP/HTTPS Multithread di C#[^]

Solusi 6

Tidak ada kata terlambat untuk mendapat jawaban?

Reservasi URL diperlukan ketika mencoba menggunakan HttpListener untuk apa pun selain localhost. Sintaksnya adalah sebagai berikut:

netsh http add urlacl url=http://<hostName>:<port>/ user=<user>

di mana : adalah titik akhir untuk HttpListener Anda, dan adalah ID pengguna atau nama grup pengguna yang akan digunakan untuk mencatat reservasi URL.

Hapus reservasi dengan sintaks berikut:

netsh http delete urlacl url=http://<hostName>:<port>/

コメント

タイトルとURLをコピーしました