2015-11-10 27 views
8

Trong ứng dụng của tôi, tôi sử dụng RestSharp để truy vấn REST API và System.Net.Mail để gửi email. Khi khởi động chương trình, tôi đặt thuộc tính ServicePointManager.SecurityProtocol.ServicePointManager SecurityProtocol xung đột

Nếu tôi đặt các tài sản để:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11; 

ngoại lệ được ném khi truy vấn API với RestSharp:

The request was aborted: Could not create SSL/TLS secure channel 

Nếu tôi đặt các tài sản để:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls11; 

ngoại lệ là được gửi khi gửi email với System.Net.Mail:

System.Security.Authentication.AuthenticationException: A call to SSPI failed, see inner exception. ---> System.ComponentModel.Win32Exception: The client and server cannot communicate, because they do not possess a common algorithm 

Tôi nên giải quyết vấn đề này như thế nào?

+0

Phiên bản .NET nào? Nếu bạn không phải là mới nhất, có thể nâng cấp không? Sau đó tôi sẽ bắt đầu bằng cách cố gắng thu hẹp nó xuống một chút. Sử dụng trình bổ sung chrome addin Postman để thử và liên lạc với API của bạn. Thiết lập Fiddler (hoặc Wireshark) để chặn lưu lượng truy cập và xem các gói để xem những gì nó đang cố gắng thương lượng. Bạn cũng chỉ sử dụng lớp SmtpClient tiêu chuẩn? mã của bạn trông như thế nào khi sử dụng? – Wjdavis5

+0

Bạn có thể đặt giá trị chính xác cho người quản lý điểm dịch vụ ngay trước khi thực hiện cuộc gọi. –

Trả lời

6

Máy chủ REST API và máy chủ thư bạn đang kết nối dường như có các yêu cầu giao thức bảo mật xung đột. Bạn sẽ cần sử dụng các cài đặt giao thức bảo mật khác nhau cho chúng.

ServicePointManager.SecurityProtocol là tĩnh và giá trị hiện tại của nó áp dụng cho tất cả các kết nối mới. Rất tiếc, không có cách nào để kiểm soát cài đặt này cho mỗi ServicePoint. (Theo ý kiến ​​của tôi, đây là lỗi thiết kế của Microsoft)

Nếu bạn có quyền kiểm soát máy chủ REST API hoặc máy chủ thư, bạn có thể định cấu hình lại để chấp nhận giao thức bảo mật không xung đột.

Nếu không, bạn có thể thiết kế lại mã của mình để tất cả các kết nối tới REST API và máy chủ thư được tạo từ hai riêng biệt AppDomains. Ví dụ:

Ví dụ: để miền ứng dụng mặc định xử lý tất cả giao tiếp REST API và tạo ra một miền ứng dụng riêng biệt thực hiện tất cả các liên lạc thư.

Với thiết lập này, bạn có thể sử dụng các giá trị ServicePointManager.SecurityProtocol khác nhau trong mỗi miền. (vì các giá trị tĩnh không được chia sẻ giữa các miền ứng dụng).