2014-09-29 150 views
15

這似乎是一個常見錯誤,但在找到解決辦法(參見下文)後,我無法確定原因我首先得到它。當SMPT服務器擁有有效的證書時,獲取「遠程證書根據驗證過程無效」

我正在將SMTP功能寫入我們的應用程序,並且正在嘗試將SSL功能添加到我們已有的工作SMTP中。

我正在使用我們公司的MS Exchange服務器進行測試,特別是在該服務器上啓用的Webmail選項。我可以通過我的代碼在內部發送電子郵件,但不會驗證我的連接並匿名發送,但由於我們公司的政策,這些電子郵件不會轉發到外部電子郵件地址。除此之外,我正在爲我們的客戶編程,他們並不都允許開放中繼和/或匿名連接。

我相信Exchange服務器正在使用顯式SSL/TLS。我嘗試telnet到端口25上的服務器地址,並得到一個文本響應,人類可讀的響應,根據我以前的一些搜索意味着它使用顯式SSL/TLS。

我有下面的測試代碼

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); 

在我的搜索,因爲我碰到這個"The remote certificate is invalid according to the validation procedure." using Gmail SMTP server

從中我得到了下面的代碼來解決......

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; 
    } 
} 

這在我的測試代碼中工作。但是我正在寫的實際過程(而不是我的測試代碼)將在後臺運行,並且無法真正詢問用戶(而是報告Windows錯誤日誌中的錯誤)。

當我開始時,我的問題是真的爲什麼我得到這個錯誤。如果我在瀏覽器中訪問https:webmail.ourdomain.co.uk,它會顯示一個有效的證書,並且沒有安裝證書的選項(如果它是自簽名的,我會這樣做)。

Certificate Screenshot 然而,當我運行我的代碼,並在ValidateServerCertificate方法調試中斷Poing的,我看證書的價值觀和看到我們的本地服務器的發行人「之前不使用」和「不要」在今天的屬性之後使用。這與我得到的證書不符。

我也檢查了sslPolicyErrors標誌在ValidateServerCertificate的調試中是什麼,它們顯示「RemoteCertificateChainErrors」和「RemoteCertificateNameMismatch」。

那麼我錯過了什麼......爲什麼它沒有使用正確的證書?如果我需要採取措施在本地安裝證書以便使用,那麼我需要了解它們,以便我可以告訴客戶如果得到此信息應該怎麼做。

我不想通過從ValidateServerCertificate方法返回true來繞過檢查,並且因爲它是後臺進程,所以我不能要求用戶,所以我需要了解如何讓我的代碼使用正確的/可信的證書。

希望有人能建議。

+0

嗯,我猜沒有人知道這個答案。還沒有找到解決方案:( – RosieC 2014-10-10 10:01:57

回答

7

我終於找到的答案是服務器上的SMTP服務沒有使用與https相同的證書。

diagnostic steps I had read here假設他們使用相同的證書,並且每次我在過去嘗試過,他們已經完成並且診斷步驟正是我多次解決問題所做的。

在這種情況下,這些步驟不起作用,因爲使用的證書不同,並且這種可能性是我從未遇到過的。

解決方案是從服務器導出實際證書,然後將其作爲可信證書安裝在我的機器上,或者爲服務器上的SMTP服務獲取不同的有效/可信證書。目前,我們的IT部門負責管理服務器,以決定他們想要做什麼。

0

舊帖子,但我想我會分享我的解決方案,因爲這個問題沒有太多的解決方案。

如果您運行的是舊版Windows Server 2003計算機,則可能需要安裝修補程序(KB938397)。

發生此問題是因爲Windows中的加密API 2(CAPI2) Server 2003不支持散列算法的SHA2系列。 CAPI2是處理證書的Cryptography API的一部分。

https://support.microsoft.com/en-us/kb/938397

無論出於何種原因,微軟希望通過電子郵件通知您此修補程序,而不是讓你直接下載的。下面是從電子郵件直接鏈接到的修補程序:

http://hotfixv4.microsoft.com/Windows Server 2003/sp3/Fix200653/3790/free/315159_ENU_x64_zip.exe

2

老的文章,但你說:「爲什麼不使用正確的證書」,我想提供一個辦法,找出其SSL證書用於這需要OpenSSL的SMTP(見here):

的OpenSSL的s_client.First -connect exchange01.int.contoso.com:25 -starttls SMTP

這將概述使用SSL CERTI爲SMTP服務命名。根據您在此處看到的內容,您可以使用正確的證書(或手動信任證書)替換錯誤的證書(如您已經這樣做)。

相關問題