2014-09-29 18 views
15

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

Certificate Screenshot 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.

+0

Beh, immagino che nessuno conosca la risposta a questo. Ancora non ho trovato una soluzione :( – RosieC

risposta

7

La risposta che ho finalmente trovato è che il servizio SMTP sul server non utilizza lo stesso certificato di https.

Il diagnostic steps I had read here fa presupporre che utilizzano lo stesso certificato e ogni volta che ho provato questo in passato hanno fatto e le fasi di diagnostica sono esattamente quello che ho fatto per risolvere il problema più volte.

In questo caso quei passaggi non hanno funzionato perché i certificati in uso erano diversi e la possibilità di questo è qualcosa che non avevo mai incontrato.

La soluzione è di esportare il certificato effettivo dal server e quindi installarlo come certificato attendibile sul mio computer o di ottenere un certificato valido/attendibile diverso per il servizio SMTP sul server. Questo è attualmente con il nostro dipartimento IT che amministrano i server per decidere quale vogliono fare.

0

Vecchio post, ma ho pensato di condividere la mia soluzione perché non ci sono molte soluzioni disponibili per questo problema.

Se si esegue un vecchio computer Windows Server 2003, è probabile che sia necessario installare un aggiornamento rapido (KB938397).

Questo problema si verifica perché l'API di crittografia 2 (CAPI2) in Windows Server 2003 non supporta la famiglia SHA2 di algoritmi di hashing. CAPI2 è la parte dell'API di crittografia che gestisce i certificati.

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

Per qualsiasi motivo, Microsoft vuole e-mail questo hotfix invece di permettere di scaricare direttamente. Ecco un link al hotfix dall'e-mail:

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

2

Vecchio post, ma come si dice "perché non viene utilizzato il certificato corretto" Vorrei offrire un modo per scoprire quale certificato SSL è utilizzato per SMTP (vedi here) che ha richiesto openssl:

OpenSSL s_client -connect exchange01.int.contoso.com:25 -starttls smtp

Ciò delineare il certificato SSL utilizzato per il servizio SMTP. Sulla base di ciò che vedi qui puoi sostituire il certificato sbagliato (come hai già fatto) con uno corretto (o fidarti del certificato manualmente).