Khi thực hiện cuộc gọi đến dịch vụ web chạy trên máy chủ bằng HTTPS, ứng dụng của tôi sẽ ném System.Net.WebException bằng thông báo "Kết nối cơ bản đã bị đóng: Có thể không thiết lập mối quan hệ tin cậy với máy chủ từ xa ". Tôi không chắc chắn làm thế nào để có được xung quanh vấn đề này và thực hiện thành công cuộc gọi.System.Net.WebException được ném khi sử dụng dịch vụ web qua HTTPS
Trả lời
Sau khi một số nghiên cứu, tôi thấy một entry blog của Jan Tielens điều này giải thích những gì đang xảy ra và cách giải quyết cho vấn đề của tôi:
Khi bạn duyệt đến một trang web HTTPS, bạn có thể nhận được một cửa sổ hộp thoại yêu cầu bạn nếu bạn muốn tin tưởng chứng chỉ được cung cấp bởi máy chủ web. Vì vậy, trách nhiệm chấp nhận chứng chỉ được xử lý bởi người dùng. Hãy quay trở lại kịch bản webservice, nếu bạn muốn gọi một webservice nằm trên một máy chủ web sử dụng SSL và HTTPS thì có một vấn đề. Khi bạn thực hiện cuộc gọi từ mã, không có cửa sổ hộp thoại bật lên và hỏi bạn có tin tưởng chứng chỉ (may mắn vì điều này sẽ khá xấu trong các tình huống phía máy chủ); có lẽ bạn sẽ nhận được sau ngoại lệ:
Một ngoại lệ unhandled của loại
System.Net.WebException
xảy ra ở System.dll
thông tin bổ sung: Các cơ bản kết nối đã được đóng cửa: Không thể lập mối quan hệ tin tưởng với máy chủ từ xa.Nhưng có một giải pháp cho vấn đề này , bạn có thể giải quyết điều này trong mã bạn bằng cách tạo riêng
CertificatePolicy
lớp học của bạn (mà cài đặt giao diệnICertificatePolicy
). Trong lớp này, bạn sẽ phải viết riêngCheckValidationResult
chức năng của bạn mà đã trở lạitrue
hoặcfalse
, như bạn sẽ nhấn yes hoặc no trong cửa sổ hộp thoại. Đối với mục đích phát triển Tôi đã tạo các lớp sau đó chấp nhận tất cả chứng chỉ, vì vậy bạn sẽ không nhận được khó chịuWebException
nữa:
public class TrustAllCertificatePolicy : System.Net.ICertificatePolicy
{
public TrustAllCertificatePolicy() { }
public bool CheckValidationResult(ServicePoint sp, X509Certificate cert, WebRequest req, int problem)
{
return true;
}
}
Như bạn thấy chức năng
CheckValidationResult
luôn trả về true, vì vậy tất cả chứng chỉ sẽ được tin cậy. Nếu bạn muốn làm cho lớp này an toàn hơn một chút, bạn có thể thêm các kiểm tra bổ sung bằng cách sử dụng thông sốX509Certificate
chẳng hạn. Để sử dụngCertificatePolicy
này, bạn sẽ phải nói với cácServicePointManager
để sử dụng nó:
System.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();
này phải được thực hiện (một lần trong ứng dụng vòng đời) trước khi thực hiện cuộc gọi vào dịch vụ web của bạn.
Nếu bạn đang sử dụng chứng chỉ SSL tự ký hoặc cert SSL không đáng tin cậy, bạn có thể yêu cầu ứng dụng bỏ qua nó (Nếu bạn thực sự muốn bỏ qua nó). ví dụ.
ServicePointManager.ServerCertificateValidationCallback = _
new RemoteCertificateValidationCallback(IgnoreSelfSSL)
public bool IgnoreSelfSSL(ServicePoint sp, X509Certificate cert,WebRequest req, int problem) {
return true;
}
Bạn có thể đặt lại cuộc gọi lại ở bất kỳ nơi nào sẽ được thực hiện trước khi thực hiện cuộc gọi dịch vụ.
Các mẹo được đưa ra trong câu trả lời phải được sử dụng chỉ để thử nghiệm. Để chấp nhận/sản xuất, bạn nên có chứng chỉ WS được cài đặt trên máy thực hiện cuộc gọi đến WS, và thực hiện xác nhận chứng chỉ trước khi gọi WS - hết hạn, chủ đề vv. Sau đó, bạn có thể thêm chứng chỉ này vào yêu cầu WS qua SoapHttpClientProtocol.Proxy.ClientCertificates.
- 1. gọi một dịch vụ web sử dụng WCF qua HTTP và HTTPS
- 2. Làm cách nào để sử dụng dịch vụ SOAP qua HTTPS trong C#?
- 3. Trang web HTTP tới dịch vụ web HTTPS bằng CORS
- 4. Sử dụng dịch vụ RESTful qua https với chứng chỉ bằng cách sử dụng Java
- 5. AJAX tên miền chéo bằng cách sử dụng jsonp và Dịch vụ Web .NET qua SSL/HTTPS
- 6. Khi nào thì không nên sử dụng dịch vụ web?
- 7. Yêu cầu Dịch vụ Web Exchange 2007/2010 với SOAP + XML qua HTTPS trong Android
- 8. Sử dụng dịch vụ web REST XML
- 9. Dịch vụ Windows đã lưu trữ WCF qua HTTPS
- 10. Lỗi XML khi gọi dịch vụ web
- 11. Sử dụng ajax để gọi dịch vụ web khi Windows Authentication được bật?
- 12. Sử dụng phản chiếu để gọi dịch vụ web ASP.NET
- 13. cách chạy một dịch vụ web RESTful trên ngăn xếp dịch vụ trên kênh https (ssl)
- 14. Dịch vụ web và ứng dụng web
- 15. Lược đồ URI được cung cấp 'https' không hợp lệ; dự kiến 'http' khi gọi dịch vụ web
- 16. Sử dụng dịch vụ web bằng cách sử dụng Javascript
- 17. Sử dụng Dịch vụ web trong C# Windows App
- 18. Khi nào sử dụng MVC4 Web-API và dịch vụ web HTTP truyền thống?
- 19. Lỗi XML được định dạng tốt khi lưu phần web tùy chỉnh hơn bằng cách sử dụng dịch vụ web
- 20. Chứng chỉ SSL cho các dịch vụ web REST (được Android sử dụng)?
- 21. Cách sử dụng Dịch vụ kép WCF qua internet?
- 22. Dịch vụ web Java Async REST sử dụng Jersey?
- 23. Truy cập các mục Sitecore qua dịch vụ web .NET
- 24. Cách sử dụng dịch vụ web ColdFusion với dotnet
- 25. Dịch vụ web với CXF: Cách sử dụng ResponseWrapper?
- 26. Cách khắc phục sự cố unicode khi sử dụng dịch vụ web với Python Suds
- 27. Dịch vụ WCF trong môi trường https
- 28. Sử dụng Máy chủ web mỏng với HTTP và HTTPS
- 29. Sử dụng ASP.NET MVC làm dịch vụ Web
- 30. Sử dụng Play 2.0 để tạo một dịch vụ web
Bạn có thể truy cập URL thông qua trình duyệt không? Nếu có, trình duyệt có cảnh báo bạn rằng chứng chỉ không hợp lệ không? – dlev