Otrzymuję ten błąd:
Zdalny certyfikat jest nieważny zgodnie z procedurą sprawdzania poprawności.
za każdym razem, gdy próbuję wysłać e-mail za pomocą serwera SMTP Gmaila w moim kodzie C #. Czy ktoś może wskazać mi właściwy kierunek rozwiązania tego problemu?
Poniżej znajduje się ślad stosu ...
at System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, Exception exception)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
at System.Net.TlsStream.CallProcessAuthentication(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)
at System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.Mail.SmtpConnection.Flush()
at System.Net.Mail.SmtpConnection.GetConnection(String host, Int32 port)
at System.Net.Mail.SmtpTransport.GetConnection(String host, Int32 port)
at System.Net.Mail.SmtpClient.GetConnection()
at System.Net.Mail.SmtpClient.Send(MailMessage message)
at BulkEmail.frmemail.mailsending(String toaddress, String fromaddress, String fromname, String subject, String pwd, String attachements, String mailmessage, String htmlmessage, Int32 i, Int32 j, String replytoaddress)
Odpowiedzi:
Aby obejść ten problem, możesz wyłączyć sprawdzanie poprawności certyfikatu. Rób to tylko w celu uzyskania potwierdzenia, że błąd jest generowany z powodu złego certyfikatu.
Wywołaj tę metodę, zanim zadzwonisz
smtpclient.Send()
:źródło
Link tutaj rozwiązał mój problem.
http://brainof-dave.blogspot.com.au/2008/08/remote-certificate-is-invalid-according.html
Poszedłem do adresu URL usługi internetowej (na serwerze, na którym wystąpił problem), kliknąłem małą ikonę bezpieczeństwa w IE, która wywołała certyfikat. Następnie kliknąłem kartę Szczegóły, kliknąłem przycisk Kopiuj do pliku, co pozwoliło mi wyeksportować certyfikat jako plik .cer. Gdy miałem certyfikat lokalnie, byłem w stanie zaimportować go do magazynu certyfikatów na serwerze, korzystając z poniższych instrukcji.
Uruchom nową MMC. Plik -> Dodaj / Usuń przystawkę ... Kliknij Dodaj ... Wybierz Certyfikaty i kliknij Dodaj. Zaznacz przycisk opcji „Konto komputera”. Kliknij Następny.
Wybierz komputer kliencki na następnym ekranie. Kliknij przycisk Zakończ. Kliknij Zamknij. Kliknij OK. TERAZ zainstaluj certyfikat w magazynie certyfikatów Zaufane główne urzędy certyfikacji. Umożliwi to wszystkim użytkownikom zaufanie do certyfikatu.
źródło
certutil -f -p test -importPFX Root devcert.pfx
icertutil -f -p test -importPFX MY devcert.pfx
. Musi zostać uruchomiony w wierszu polecenia administratora (przy założeniu, że hasłotest
Możesz poprawić kod, pytając użytkownika, kiedy certyfikat jest nieważny, czy chce kontynuować, czy nie. Czy chcesz kontynuować? Jak poniżej:
I dodaj taką metodę:
źródło
Trochę za późno na imprezę, ale jeśli szukasz rozwiązania takiego jak Yury, poniższy kod pomoże ci ustalić, czy problem dotyczy certyfikatu z podpisem własnym, a jeśli tak, zignoruj błąd samopodpisania. Możesz oczywiście sprawdzić inne błędy SSL, jeśli chcesz.
Używany przez nas kod (dzięki uprzejmości Microsoft - http://msdn.microsoft.com/en-us/library/office/dd633677(v=exchg.80).aspx ) jest następujący:
źródło
Miałem dokładnie ten sam problem i zorientowałem się, że domyślnie Ochrona poczty z programu antywirusowego Avast ma aktywowane „Skanuj połączenie SSL” . Upewnij się, aby to wyłączyć .
Z mojej wiedzy Avast „otworzy” pocztę, skanuje ją w poszukiwaniu wirusów, a następnie podpisuje za pomocą własnego certyfikatu, aby poczta nie była już podpisywana przez certyfikat gmail, który powoduje ten błąd.
Rozwiązanie 1:
Rozwiązanie 2 (powinno być najlepszym językiem bezpieczeństwa):
źródło
Uzyskaj ten sam błąd podczas wysyłania z programu Outlook z powodu ssl. Sprawdzone ustawienie EnableSSL = false rozwiązało problem.
przykład:
źródło
Czy na pewno używasz prawidłowego adresu serwera SMTP?
Zarówno smtp.google.com, jak i smtp.gmail.com działają, ale certyfikat SSL jest wydawany drugiemu.
źródło
Miałem ten sam błąd, gdy próbowałem wysłać wiadomość e-mail za
SmtpClient
pośrednictwem serwera proxy (Usergate).Sprawdza, czy certyfikat zawiera adres serwera, który nie jest równy adresowi serwera proxy, stąd błąd. Moje rozwiązanie: gdy podczas sprawdzania certyfikatu wystąpi błąd, otrzymaj certyfikat, wyeksportuj go i sprawdź.
Pełny kod mojej klasy nadawcy e-maila:
}
źródło
Wiem, że jestem spóźniony w tej grze, ale nie widziałem tutaj odpowiedzi wskazującej na logi systemowe.diagnostics dla strumienia TLS.
Przed wprowadzeniem jakichkolwiek zmian w kodzie upewnij się, że rozumiesz, na czym polega problem. Jest
AuthenticationException
to jeden z bardzo ogólnych wyjątków, który niewiele mówi. Aby dowiedzieć się, co dzieje się pod maską, edytuj plik app.config dla swojej aplikacji (lub utwórz nowy) i upewnij się, że masz włączone źródło śledzenia System.Net wsystem.diagnostics
sekcji, na przykład:Uruchom ponownie aplikację i sprawdź plik c: \ network.log. Powinieneś zobaczyć tam szczegółowe informacje na temat połączenia TLS (SSL), na przykład:
Wiedząc, co powoduje problem, powinieneś być w stanie go rozwiązać lub przynajmniej zawęzić wyszukiwanie w Google.
źródło
Mój problem dotyczył systemu Windows 2003 Server podczas wywoływania AuthenticateAsClient. Powyższe rozwiązania (np. Obchodzenie
ServicePointManager.ServerCertificateValidationCallback
) nie działały.Okazuje się, że jest to błąd w systemie Windows 2003 i jest poprawka:
„Aplikacje korzystające z interfejsu API kryptografii nie mogą sprawdzić poprawności certyfikatu X.509 w systemie Windows Server 2003”
https://support.microsoft.com/en-us/kb/938397
Zainstalowanie tej poprawki rozwiązało mój problem.
źródło
Folder witryny wymaga zabezpieczeń usługi sieciowej. Zwłaszcza web.config. Używa tego konta, aby uzyskać dostęp do rejestru certyfikatów. To powstrzyma potrzebę dodawania hacka do twojego kodu.
źródło
Moim problemem nie było to, że odwoływałem się do serwera za pomocą adresu IP zamiast adresu URL. Kupiłem podpisany certyfikat od urzędu certyfikacji do użytku w sieci prywatnej. Adres URL określony w certyfikacie ma znaczenie, gdy odwołuje się do serwera. Gdy tylko odwołałem się do serwera przez adres URL w certyfikacie, wszystko zaczęło działać.
źródło
Sprawdź datę i godzinę komputera. Jeśli jest niepoprawny, zaktualizuj go do bieżącej godziny lub ustaw ją automatycznie, aby uzyskać czas z Internetu.
Ponieważ certyfikaty są powiązane z ustalonym przedziałem czasowym, jeśli twój zegar jest nieprawidłowy, prawdopodobnie wystąpią takie błędy. W tym scenariuszu przez ustalenie czasu problem zostanie rozwiązany.
źródło
Dla osób napotykających ten sam błąd podczas łączenia się z lokalną witryną z samopodpisanym certyfikatem pomógł mi następujący post na blogu.
http://brainof-dave.blogspot.com.au/2008/08/remote-certificate-is-invalid-according.html
źródło
W naszym przypadku problem był spowodowany certyfikatem serwera IIS. Temat certyfikatu został ustawiony na nazwę DNS, a użytkownicy próbowali uzyskać dostęp do strony internetowej za pomocą adresu IP, więc weryfikacja certyfikatu .NET nie powiodła się. Problem zniknął, gdy użytkownicy zaczęli używać nazwy DNS.
Musisz więc zmienić adres URL dostawcy na https: //CertificateSubject/xxx/xxx.application
źródło
Artykuł na blogu MSDN poświęcony badaniu tego typu problemów:
Rozwiązywanie problemów z platformą ASP.NET - certyfikat zdalny jest nieprawidłowy zgodnie z procedurą sprawdzania poprawności:
http://blogs.msdn.com/b/jpsanders/archive/2009/09/16/trourors-asp-net-the-remote-certificate- is-invalid-zgodnie z the-validation-procedure.aspx
źródło
Dodanie tej linii działało dla mnie. To faktycznie ufa wszystkim certyfikatom wymienionym tutaj . Można to jednak wykorzystać przede wszystkim do rozwiązywania problemów. Jeśli to działa, oznacza to, że certyfikat zdalnego serwera nie został dodany jako zaufany certyfikat na twoim komputerze.
Pełny kod to
źródło
To rozwiązało mój problem
// W odniesieniu do // Problem występuje tylko Użyj powyższej linii, aby ustawić fałszywy SSl, aby rozwiązać błąd, gdy nazwa użytkownika i hasło zostaną wprowadzone w ustawieniach SMTP.
źródło
oto rozwiązanie, z którego zdecydowałem się skorzystać.
źródło
Kod z zaakceptowanej odpowiedzi pomógł mi debugować problem. Wtedy zdałem sobie sprawę, że pole SN
certificate
argumentu nie było takie samo, jak myślałem, że to mój serwer SMTP. UstawiającHost
właściwość instancji SmtpClient na wartość SN certyfikatu, udało mi się rozwiązać problem.źródło