Domanda

Quando provo a inviare e-mail usando C # con il server SMTP di Gmail, ottengo questo errore.

" Il certificato remoto non è valido secondo la procedura di convalida " ;.

SSL è abilitato

La porta utilizzata è 587

il nome del server utilizzato è " Smtp.gmail.com " ;.

nome utente e password sono corretti

outlook express funziona perfettamente sullo stesso PC con le stesse impostazioni

Il programma c # funziona anche bene in altri posti ... questo errore viene visualizzato solo al posto dei client.

Gradirei qualsiasi aiuto ..

Grazie

Modifica: @ Andomar, dove trovo i certificati di root nel client? Come posso risolvere questo problema?

@ Alnitak, Come posso pubblicare starttls usando la libreria System.Net.Mail?

@ David, cosa devo passare come parametro per " (mittente oggetto, certificato certificato X509, catena X509Chain, SslPolicyErrors sslPolicyErrors) "

Grazie David. Ho aggiunto quelle righe. Ma sono ancora confuso su cosa sta succedendo poiché questo codice non ha alcuna connessione diretta con System.Net.Mail per quanto ne so. Spero che il problema scompaia.

È stato utile?

Soluzione

Verificare inoltre che i certificati radice siano presenti nell'archivio Autorità radice attendibile del client. Se questo proviene da un servizio, può essere d'aiuto l'aggiunta dei certificati radice all'archivio del computer locale. Per capire meglio il motivo, ho trovato utile la seguente politica ...

public bool ValidateServerCertificate( object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
// No errors so continue…
if (sslPolicyErrors == SslPolicyErrors.None)
       return true;

// I’m just logging it to a label on the page, 
//  this should be stored or logged to the event log at this time. 
lblStuff.Text += string.Format("Certificate error: {0} <BR/>", sslPolicyErrors);

// If the error is a Certificate Chain error then the problem is
// with the certificate chain so we need to investigate the chain 
// status for further info.  Further debug capturing could be done if
// required using the other attributes of the chain.
      if (sslPolicyErrors == SslPolicyErrors.RemoteCertificateChainErrors)
      {
       foreach (X509ChainStatus status in chain.ChainStatus)
       {
             lblStuff.Text += string.Format("Chain error: {0}: {1} <BR/>", status.Status, status.StatusInformation);
  }
}

// Do not allow this client to communicate 
//with unauthenticated servers.
      return false;
}

Per aggiungere la politica in, utilizzare quanto segue, questo deve essere fatto solo una volta per il dominio dell'applicazione.

using System.Net;
...
ServicePointManager.ServerCertificateValidationCallback =
new Security.RemoteCertificateValidationCallback(ValidateServerCertificate);

Puoi anche utilizzare la politica per rimuovere del tutto l'errore, ma sarebbe meglio risolvere il problema piuttosto che farlo.

Altri suggerimenti

Verifica se i certificati radice corretti si trovano nell'archivio del client. E la data di sistema del client è corretta.

Stai utilizzando STARTTLS o stai presupponendo che la connessione sulla porta 587 sia crittografata SSL fin dall'inizio?

I server di Google su smtp.gmail.com richiedono STARTTLS.

Hai impostato

 client.EnableSsl = true;

perché gmail ne ha bisogno

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top