Questo sembra un errore comune ma mentre ho trovato un rimedio (vedi sotto) non riesco a decifrare il motivo Lo sto prendendo in primo luogo.Ottenere "Il certificato remoto non è valido secondo la procedura di convalida" quando il server SMPT ha un certificato valido
Sto scrivendo la funzionalità SMTP nella nostra applicazione e sto tentando di aggiungere funzionalità SSL al protocollo SMTP funzionante già esistente.
Sto testando utilizzando il server MS Exchange della nostra azienda e in particolare l'opzione webmail abilitata. Posso inviare e-mail internamente attraverso il mio codice non autentificando la mia connessione e inviando anonimamente, tuttavia tali e-mail non verranno inoltrate a indirizzi e-mail esterni a causa della nostra politica aziendale. Oltre a ciò sto programmando questo per i nostri clienti e non tutti consentono connessioni open relay e/o anonime.
Credo che il server di Exchange stia utilizzando SSL/TLS esplicito. Ho provato telnet all'indirizzo del server sulla porta 25 e ho ricevuto una risposta testuale, risposta leggibile dall'uomo, che in base ad alcune delle mie ricerche indicava in precedenza che utilizza SSL esplicito/TLS.
Ho il seguente codice di prova
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);
Durante la mia ricerca di una soluzione mi sono imbattuto in questo "The remote certificate is invalid according to the validation procedure." using Gmail SMTP server
da cui ho ottenuto il seguente codice di ...
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;
}
}
Questo funziona nel mio codice di test. TUTTAVIA il processo effettivo che sto scrivendo (piuttosto che il mio codice di test) verrà eseguito in background e non può davvero chiedere all'utente (invece riporta errori nel registro degli errori di Windows).
Come ho iniziato, la mia domanda è davvero il motivo per cui sto ricevendo questo errore. Se vado su https: webmail.ourdomain.co.uk in un browser mostra un certificato valido e non vi è alcuna opzione per installare il certificato (come avrei fatto se fosse autofirmato).
Tuttavia quando eseguo il mio codice, con un poing un'interruzione di debug nel metodo ValidateServerCertificate, guardo i valori certificati e vedere un emittente del nostro server locale e 'non utilizzare prima', e 'don' t usare dopo 'proprietà di oggi. Questo non corrisponde al certificato che sto ricevendo.
Ho anche controllato quali sono i flag sslPolicyErrors nel debug di ValidateServerCertificate e mostrano "RemoteCertificateChainErrors" e "RemoteCertificateNameMismatch".
Quindi cosa mi manca di questo ... perché non utilizza il certificato corretto? Se sono necessari dei passaggi per installare il certificato in locale perché possa essere utilizzato, è necessario conoscerli in modo da poter dire ai miei clienti cosa fare se ottengono questo.
Non voglio escludere semplicemente il controllo restituendo true dal metodo ValidateServerCertificate e poiché si tratta di un processo in background non posso chiedere all'utente, quindi ho bisogno di capire come utilizzare il mio codice il certificato corretto/fidato.
Spero che qualcuno possa consigliare.
Beh, immagino che nessuno conosca la risposta a questo. Ancora non ho trovato una soluzione :( – RosieC