SmtpClient
을 사용하여 SSL을 사용하는 SMTP 서버를 통해 전자 메일을 보냅니다. 이 SMTP 서버는 자체 서명 인증서를 사용하도록 구성됩니다.ServicePointManager.ServerCertificateValidationCallback을 재정의 할 때 기본 인증서 유효성 검사 실행
모든 클라이언트 컴퓨터에 인증서를 설치할 수있는 범위가 좁기 때문에 ServicePointManager.ServerCertificateValidationCallback
을 추가하여 자체 서명 된 인증서의 사용자 지정 유효성 검사를 구현했습니다.
그러나 SmtpClient
을 사용할 때만 사용자 지정 유효성 검사를 실행하고 다른 곳에서 인증서 유효성 검사를 수행 할 때 기본 동작으로 되돌리고 싶습니다.
콜백은 정적 속성이므로 콜백이 전자 메일을 보내는 데 사용하는 스레드가 아닌 다른 스레드에서 호출되지 않도록해야합니다.
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
이메일을 보내는 변수에 기본 ServerCertificateValidationCallback
을 유지하는 것입니다 때이 코드를 어떻게해야합니까, 사용자 지정 유효성 검사를 수행 할 플래그는 사용자 지정 유효성 검사를 수행 :
는 다음 코드를 내놓았다 과 같은 스레드에서 SyncLock
을 사용하여 다른 스레드가 사용자 지정 유효성 검사를 수행하지 못하게 한 다음 기본 동작으로 되돌리고 다른 스레드가 기본 인증서 유효성 검사를 계속할 수 있도록합니다.
그러나 기본적으로 ServerCertificateValidationCallback
은 Nothing
으로 설정되어 있으므로 기본 유효성 검사 콜백을 명시 적으로 호출 할 수 없습니다.
필요할 때 기본 인증서 유효성 검사를 실행하는 Return _defaultServerCertificateValidationCallback(s, certificate, chain, sslPolicyErrors)
대신 호출 할 수있는 것이 있습니까?