Tôi sử dụng số SmtpClient
để gửi email qua máy chủ SMTP bằng SSL. Máy chủ SMTP này được định cấu hình để sử dụng chứng chỉ tự ký.Thực hiện xác thực chứng chỉ mặc định khi ghi đè ServicePointManager.ServerCertificateValidationCallback
Vì nó nằm ngoài phạm vi để tôi cài đặt chứng chỉ trên tất cả các máy khách, tôi đã thêm ServicePointManager.ServerCertificateValidationCallback
để thực hiện xác thực tùy chỉnh cho chứng chỉ tự ký của chúng tôi.
Tuy nhiên, tôi muốn thực thi xác thực tùy chỉnh chỉ khi tôi đang sử dụng SmtpClient
và hoàn nguyên về hành vi mặc định khi xác thực chứng chỉ được thực hiện ở nơi khác.
Vì gọi lại là thuộc tính tĩnh, tôi cũng nên đảm bảo rằng cuộc gọi lại không được gọi bởi một chuỗi khác so với thư tôi sử dụng để gửi email.
tôi đã đưa ra đoạn mã sau:
Private Shared _defaultServerCertificateValidationCallback As System.Net.Security.RemoteCertificateValidationCallback
Private Shared _overrideSmtpCertificateValidation As Boolean = False
Private Shared _callbackLocker As New Object()
Private Shared Function OurCertificateValidation(s As Object, certificate As Security.Cryptography.X509Certificates.X509Certificate, chain As Security.Cryptography.X509Certificates.X509Chain, sslPolicyErrors As Net.Security.SslPolicyErrors) As Boolean
SyncLock _callbackLocker
If _overrideSmtpCertificateValidation Then
_overrideSmtpCertificateValidation = False
Dim actualCertificate = Security.Cryptography.X509Certificates.X509Certificate.CreateFromCertFile("selfSignedSmtp.cert")
Return certificate.Equals(actualCertificate)
Else
'Should execute the default certificate validation.
Return _defaultServerCertificateValidationCallback(s, certificate, chain, sslPolicyErrors)
End If
End SyncLock
End Function
Public Sub SendMail()
_defaultServerCertificateValidationCallback = System.Net.ServicePointManager.ServerCertificateValidationCallback
System.Net.ServicePointManager.ServerCertificateValidationCallback = New System.Net.Security.RemoteCertificateValidationCallback(AddressOf OurCertificateValidation)
_overrideSmtpCertificateValidation = True
'Send mail using SMTP client here...
End Sub
gì mã này nên làm khi gửi một email là để giữ mặc định ServerCertificateValidationCallback
trong một biến, cờ xác nhận tùy chỉnh được thực hiện, thực hiện các xác nhận tùy chỉnh trên cùng một chuỗi với tên SmtpClient
, ngăn các chủ đề khác thực hiện xác thực tùy chỉnh bằng cách sử dụng SyncLock
, sau đó hoàn nguyên về hành vi mặc định và cho phép các chủ đề khác tiếp tục xác thực chứng chỉ mặc định.
Tuy nhiên, ServerCertificateValidationCallback
được đặt thành Nothing
theo mặc định, vì vậy tôi không thể gọi rõ ràng cuộc gọi xác thực mặc định.
Có điều gì tôi có thể gọi thay vì Return _defaultServerCertificateValidationCallback(s, certificate, chain, sslPolicyErrors)
có thể thực thi xác thực chứng chỉ mặc định khi cần không?