Đây có vẻ là lỗi phổ biến nhưng trong khi tôi tìm thấy một công việc xung quanh (xem bên dưới), tôi không thể xác định lý do Tôi nhận được nó ở nơi đầu tiên.Nhận "Chứng chỉ từ xa không hợp lệ theo quy trình xác thực" khi máy chủ SMPT có chứng chỉ hợp lệ
Tôi đang viết chức năng SMTP vào ứng dụng của chúng tôi và tôi đang cố thêm chức năng SSL vào SMTP đang hoạt động mà chúng tôi đã có.
Tôi đang thử nghiệm bằng máy chủ MS Exchange của công ty và cụ thể là tùy chọn webmail được bật trên đó. Tôi có thể gửi email nội bộ thông qua mã của tôi bằng cách không xác thực kết nối của tôi và gửi ẩn danh, tuy nhiên những email đó sẽ không chuyển tiếp tới địa chỉ email bên ngoài do chính sách công ty của chúng tôi. Bên cạnh đó tôi đang lập trình này cho khách hàng của chúng tôi và họ không phải tất cả cho phép mở relay và/hoặc các kết nối vô danh.
Tôi tin rằng máy chủ Exchange đang sử dụng SSL/TLS rõ ràng. Tôi đã thử telnet đến địa chỉ của máy chủ trên cổng 25 và nhận được phản hồi văn bản, phản hồi có thể đọc được của con người, theo một số tìm kiếm của tôi trước đây có nghĩa là nó sử dụng Explicit SSL/TLS.
Tôi có mã kiểm tra sau
SmtpClient SMTPClient = new SmtpClient(webmailaddress);
SMTPClient.Port = 25;
SMTPClient.UseDefaultCredentials = true;
SMTPClient.EnableSsl = true;
System.Net.Mail.MailMessage Message = new `
System.Net.Mail.MailMessage(emailFrom,emailTo,subject,body);
SMTPClient.Send(Message);
Trong tìm kiếm của tôi cho một giải pháp tôi đi qua này "The remote certificate is invalid according to the validation procedure." using Gmail SMTP server
Từ mà tôi nhận được đoạn mã sau ...
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);
public static bool ValidateServerCertificate(object sender,X509Certificate certificate,X509Chain chain,SslPolicyErrors sslPolicyErrors)
{
if (sslPolicyErrors == SslPolicyErrors.None)
return true;
else
{
if (System.Windows.Forms.MessageBox.Show("The server certificate is not valid.\nAccept?", "Certificate Validation", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
return true;
else
return false;
}
}
này hoạt động trong mã thử nghiệm của tôi. BAO GIỜ quá trình thực tế tôi đang viết (thay vì mã thử nghiệm của tôi) sẽ chạy trong nền và không thể thực sự yêu cầu người dùng (thay vào đó nó báo cáo lỗi trong nhật ký lỗi cửa sổ).
Khi tôi bắt đầu, câu hỏi của tôi thực sự là lý do tại sao tôi nhận được lỗi này. Nếu tôi truy cập https: webmail.ourdomain.co.uk trong trình duyệt, nó hiển thị chứng chỉ hợp lệ và không có tùy chọn cài đặt chứng chỉ (như tôi đã thực hiện nếu đó là chứng chỉ tự ký).
Tuy nhiên, khi tôi chạy mã của mình, với lỗi ngắt trong phương thức ValidateServerCertificate, tôi xem xét các giá trị chứng chỉ và xem nhà phát hành máy chủ cục bộ của chúng tôi và 'không sử dụng trước' và 'don' t sử dụng sau khi 'tài sản của ngày hôm nay. Điều này không khớp với chứng chỉ tôi nhận được.
Tôi cũng đã kiểm tra xem các cờ sslPolicyErrors có trong debug của ValidateServerCertificate và chúng đang hiển thị "RemoteCertificateChainErrors" và "RemoteCertificateNameMismatch" hay không.
Vì vậy, tôi thiếu gì về điều này ... tại sao nó không sử dụng chứng chỉ chính xác? Nếu có các bước tôi cần thực hiện để cài đặt chứng chỉ cục bộ để sử dụng thì tôi cần phải biết chúng để tôi có thể cho khách hàng biết phải làm gì nếu họ nhận được điều này.
Tôi không muốn chỉ bằng cách vượt qua kiểm tra bằng cách trả về true từ phương thức ValidateServerCertificate và vì đó là quy trình nền mà tôi không thể hỏi người dùng, vì vậy tôi cần hiểu cách sử dụng mã của mình chứng chỉ đúng/đáng tin cậy.
Hy vọng ai đó có thể tư vấn.
Tôi đoán không ai biết câu trả lời cho điều này. Vẫn chưa tìm thấy giải pháp :( – RosieC