HttpListener chỉ hỗ trợ SSL cho localhost?

lập trình

[ad_1]

Xin chào,

Tôi nghĩ nhiều người biết và sử dụng HttpListener[^] lớp học.

Theo như tôi thấy từ ghi chú trên MSDN thì nó hỗ trợ lưu lượng 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.

Tôi đã thêm chứng chỉ gốc vào chứng chỉ đáng tin cậy trong bộ nhớ cục bộ và một chứng chỉ nữa cho cá nhân cũng trong bộ nhớ cục bộ được ký bởi chứng chỉ gốc:

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"

Tôi đã liên kết chứng chỉ với cổng như thế này:

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

Và mọi thứ đều hoạt động nhưng chỉ dành cho các trang web trên localhost. Khi tôi cố mở ví dụ https://codeproject.com. HttpListener yêu cầu “không nghe thấy”. Trình duyệt cố gắng mở trang web nhưng không thành công khi hết thời gian chờ.

BTW, tôi biết nó được gọi là cuộc tấn công trung gian nhưng nó chỉ dành cho mục đích thử nghiệm và rất tiếc là tôi không thể sử dụng Fiddler cũng sử dụng kỹ thuật này.

Theo truyền thống, câu hỏi của tôi không đơn giản, tôi tin rằng ở đây không có “xếp hạng miễn phí” nào các bạn, xin lỗi 🙂 nhưng nếu bạn có thể giúp tôi thì thật tuyệt.

Một lưu ý nữa – Tôi đã đọc hầu hết các bài viết về vấn đề này và tất cả các ví dụ về localhost ở đó. Vì vậy, nếu bạn định cung cấp cho tôi liên kết đến một bài viết, vui lòng kiểm tra xem đây có thể là ví dụ này cho localhost;)

Và một điều nữa – Có thể gợi ý của bạn sẽ sử dụng TcpListner hoặc thứ gì đó tương tự. Hiện tại tôi không muốn thay đổi logic, tôi sẽ thay đổi logic nếu nó chỉ là giải pháp.

Cảm ơn rất nhiều. Timur.

Giải pháp 1

Tuyệt vời! hơn 50 lượt xem mà không có câu trả lời như thường lệ 🙂 Tự mình trả lời như thường lệ.

HttpListener là lớp cấp cao hơn TCPListener. Tất nhiên điều này có nghĩa là làm việc với HttpListener sẽ dễ dàng hơn nhưng! điều này cũng có nghĩa là thiếu chức năng. Ý tôi là bạn không thể xây dựng proxy nghiêm túc bằng HTTPListener.

Như chúng ta đã biết để làm việc với ổ cắm bảo mật (SSL), chúng ta cần thực hiện bắt tay SSL (phương thức CONNECT, v.v.). Nhưng đối với HttpListener thì việc này phải được thực hiện thông qua liên kết chứng chỉ (Netsh http add sslcert). Tất cả những gì tôi có thể nói là tôi đã thử mọi cách và không thể làm được điều này với máy chủ từ xa, chỉ với localhost. Tôi không biết lý do, xin lỗi.
Tiếp theo, việc đặt giá thầu chứng chỉ này không thoải mái khi sử dụng về mặt proxy. Nếu tôi muốn tạo chứng chỉ nhanh chóng với đúng chủ đề CN thì sao?

Tất cả điều này khiến tôi phải viết lại ứng dụng của mình để sử dụng TCPListener và xử lý các phương thức CONNECT.

Bài viết sau đây giúp tôi hiểu những điều cơ bản:
Triển khai Máy chủ proxy gỡ lỗi HTTP/HTTPS đa luồng trong C#[^]

Giải pháp 6

Không bao giờ quá muộn cho một câu trả lời?

Cần phải đặt trước URL khi cố gắng sử dụng HttpListener cho bất kỳ mục đích nào khác ngoài localhost. Cú pháp cho việc này như sau:

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

trong đó : là điểm cuối cho HttpListener của bạn và là ID người dùng hoặc tên nhóm người dùng mà việc đặt trước URL sẽ được ghi lại.

Xóa đặt chỗ theo cú pháp sau:

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

[ad_2]

コメント

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