powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / SSL:Удаленный сертификат недействителен согласно результатам проверки подлинности.
19 сообщений из 19, страница 1 из 1
SSL:Удаленный сертификат недействителен согласно результатам проверки подлинности.
    #38965868
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А реально кодом побороть эту ошибку?

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
    Private pop3Stream As Stream
...
         If m_useSSL Then
          'get SSL stream
          Try
            CallTrace("   Get SSL connection")
            pop3Stream = New SslStream(serverTcpConnection.GetStream(), False)
            pop3Stream.ReadTimeout = m_readTimeout
          Catch ex As Exception
            Throw New Pop3Exception("Server " + m_popServer + " found, but cannot get SSL data stream." & vbLf & "Runtime Error: " + ex.ToString())
          End Try

          'perform SSL authentication
          Try
            CallTrace("   Get SSL authentication")
            DirectCast(pop3Stream, SslStream).AuthenticateAsClient(m_popServer)
          Catch ex As Exception
            Throw New Pop3Exception("Server " + m_popServer + " found, but problem with SSL Authentication." & vbLf & "Runtime Error: " + ex.ToString())
          End Try
        Else



Код: vbnet
1.
2.
3.
4.
5.
Run Time Error Occured:
Server bla-bla-bla.com found, but problem with SSL Authentication.
Runtime Error: System.Security.Authentication.AuthenticationException: Удаленный сертификат недействителен согласно результатам проверки подлинности.
   в System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, Exception exception)
...



Возникает например на агаве при любом коннекте по SSL(POP3, IMAP),
на форумах здесь тема эта в бытовом смысле поднималась

В почтовом клиенте типа OE чтобы обойти "принят недостоверный сертификат" надо нажать кнопку "Продолжить", часто один раз на всю дальнейшую жизнь.

Нашел вот еще:
https://msdn.microsoft.com/ru-ru/library/ee517298.aspx
Ошибка при проверке SSL-сертификатаЧтобы воспроизвести ошибку при проверке SSL-сертификата, когда WinHTTP не предоставляется конфигурация прокси-сервера, выполните указанные ниже действия.
1. Установите приложение, которое подключается к веб-службе по протоколу SSL. Запустите приложение с учетной записью Network Service или Local System.
Укажите в файле app.config приложения, что подключение осуществляется через прокси-сервер.
2. Приложение выдаст следующее исключение:
Код: vbnet
1.
2.
3.
4.
WebException: System.Net.WebException: Ошибка подключения к веб-службе: Базовое соединение закрыто:
 Не удалось установить доверительные отношения для защищенного канала SSL/TLS.
 ---> System.Net.WebException: Базовое соединение закрыто: Не удалось установить доверительные отношения для защищенного канала SSL/TLS.
 ---> System.Security.Authentication.AuthenticationException: Удаленный сертификат недействителен согласно результатам проверки подлинности.


Это происходит потому, что приложение предоставляет платформе .NET сведения о конфигурации прокси-сервера в файле app.config, а WinHTTP этих сведений не получает. Это приводит к сбою запросов AIA и промежуточных центров сертификации в процессе проверки допустимости цепочки сертификатов.

Чтобы устранить эту проблему, настройте прокси-сервер WinHTTP в соответствии с конфигурации в файле app.config приложения с помощью программы proxycfg.exe или функции WinHttpSetDefaultProxyConfiguration.

Меня интересует, можно ли это обойти кодом (желательно безусловно без msgbox-ов и без подстроек чего-то там в системе какими-то утилитами).
Чтоб процесс автоматом пошел дальше (ну запись в логе, пожалуйста).
...
Рейтинг: 0 / 0
SSL:Удаленный сертификат недействителен согласно результатам проверки подлинности.
    #38966049
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, https://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.servercertificatevalidationcallback.aspx ?

Код: c#
1.
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };



Но это не последние грабли...
...
Рейтинг: 0 / 0
SSL:Удаленный сертификат недействителен согласно результатам проверки подлинности.
    #38966066
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, да, еще в соседнем топике Изопропил про SSLStream говорил... там есть соответствующая перегрузка конструктора.
...
Рейтинг: 0 / 0
SSL:Удаленный сертификат недействителен согласно результатам проверки подлинности.
    #38966155
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buser,

Я правильно понял, что если в callback-е ServerCertificateValidationCallback
я тупо верну true, то
.AuthenticateAsClient съест "нехороший сертификат", не выдаст ошибки и дальнейший процесс пойдет как и с "хорошим" сертификатом?

>Но это не последние грабли...
Что имел ввиду?
...
Рейтинг: 0 / 0
SSL:Удаленный сертификат недействителен согласно результатам проверки подлинности.
    #38966161
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,
1. да
2. многопоточность
...
Рейтинг: 0 / 0
SSL:Удаленный сертификат недействителен согласно результатам проверки подлинности.
    #38966164
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, в колбяке можно проводить доп анализ... посмотрите сигнатуру...
...
Рейтинг: 0 / 0
SSL:Удаленный сертификат недействителен согласно результатам проверки подлинности.
    #38966196
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buser2. многопоточность
А что там может не срастить с потоками то?
Классы по pop3 и imap я целиком выложил в 2-х соседних топиках
Ф-ция Connect()

>Дмитрий77, в колбяке можно проводить доп анализ... посмотрите сигнатуру
Ну да, посмотрю. Можно в лог чего нибудь умное написать.
Можно галку в настройках проги сделать: типа принимать или не принимать такую фигню...
жулики эта моя агава, что в web панель заходишь, что ssl-почта
не могли сертификат нормальньный поставить
но предполагаю что это не только агава такая "умная", поэтому лучше сразу отработать этот момент.
с gmail, mail.ru этой фигни же нету, там не выкидывает.

еще правда есть Net.Mail и CDO где ssl "встроенное"
...
Рейтинг: 0 / 0
SSL:Удаленный сертификат недействителен согласно результатам проверки подлинности.
    #38966419
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buser,

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
        If m_useSSL Then
          'get SSL stream
          Try
            CallTrace("   Get SSL connection")
            ImapStream = New SslStream(serverTcpConnection.GetStream(), False, _
             New RemoteCertificateValidationCallback(AddressOf ValidateServerCertificate))
            ImapStream.ReadTimeout = m_readTimeout
          Catch ex As Exception
            Throw New ImapException("Server " + m_ImapServer + " found, but cannot get SSL data stream." & vbCrLf & "Runtime Error: " + ex.ToString())
          End Try

          'perform SSL authentication
          Try
            CallTrace("   Get SSL authentication")
            DirectCast(ImapStream, SslStream).AuthenticateAsClient(m_ImapServer)
          Catch ex As Exception
            Throw New ImapException("Server " + m_ImapServer + " found, but problem with SSL Authentication." & vbCrLf & "Runtime Error: " + ex.ToString())
          End Try
...
    Private Function ValidateServerCertificate(ByVal sender As Object, ByVal certificate As X509Certificate, _
     ByVal chain As X509Chain, ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
      Debug.Print(certificate.Subject)
      If sslPolicyErrors = sslPolicyErrors.None Then
        Return True
      End If

      Debug.Print("Certificate error: {0}", sslPolicyErrors)

      ' Do not allow this client to communicate with unauthenticated servers.
      Return True ' False
    End Function



Ну, так все проскакивает .
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
22.05.2015 14:33:07	myserver.com	   Connect at port 993
22.05.2015 14:33:07	myserver.com	   Get SSL connection
22.05.2015 14:33:07	myserver.com	   Get SSL authentication
22.05.2015 14:33:07	myserver.com	Rx '* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE
 THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE AUTH=PLAIN ACL ACL2=UNION] 
 Courier-IMAP ready. Copyright 1998-2010 Double Precision, Inc.  See COPYING for distribution information.'
22.05.2015 14:33:07	myserver.com	   ImapMailClient Connection State Authorization reached



Дебаг, который выделен в коде пишет:
Код: vbnet
1.
2.
E=admin@agava.com, OID.2.5.4.41=., CN=cpXXX.agava.net, OU=IT Department, O=AGAVA Software Ltd., L=Moscow, S=Moscow, C=RU
Certificate error: RemoteCertificateNameMismatch, RemoteCertificateChainErrors



Ну у меня тогда 2 вопроса :
1. Разумно ли код так и оставить в этом виде?
Код: vbnet
1.
Return True


2. Как вывести ошибку проверки сертификата в основной дебаг?
Где ее брать теперь?
Ну, на плохой отзыв мы теперь плюем,
но надо ж где то залогировать что
Удаленный сертификат недействителен согласно результатам проверки подлинности.
Как текстовое описание ошибки теперь выкопать (для протокола...)?
Роскошь бесить юзера окном, как это делают всякие Outlook, позволить себе не могу (прога на автомате коннектится),
а вот предупредить бы в логе что вот такое дело бы надо.
...
Рейтинг: 0 / 0
SSL:Удаленный сертификат недействителен согласно результатам проверки подлинности.
    #38966515
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,
1. не уверен... можно где-то кешировать инфу о сертификате и о том как поступать именно с этим невалидным сертификатом.
2. В хендлере ServerCertificateValidationCallback https://msdn.microsoft.com/ru-ru/library/ms145055(v=vs.110).aspx + https://msdn.microsoft.com/ru-ru/library/system.security.cryptography.x509certificates.x509chain.chainstatus(v=vs.110).aspx

Но я не большой специалист... просто ходил мимо этих граблей.
...
Рейтинг: 0 / 0
SSL:Удаленный сертификат недействителен согласно результатам проверки подлинности.
    #38966622
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buser1. не уверен... можно где-то кешировать инфу о сертификате и о том как поступать именно с этим невалидным сертификатом.
этот код точно не кэширует
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
  Private Function ValidateServerCertificate(ByVal sender As Object, ByVal certificate As X509Certificate, _
     ByVal chain As X509Chain, ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
      If sslPolicyErrors = sslPolicyErrors.None Then
        Return True
      End If

      ' Do not allow this client to communicate with unauthenticated servers.
      Return Form1.CheckBoxIgnore.Checked
    End Function


Можно играться сколь угодно раз туда сюда (в одном запуске программы).
При нажатом чекбоксе - плюет на сертификат, при ненажатом - выкидывает ошибку какую указал в начале топика.

А при "хорошем сертификате" (sslPolicyErrors.None) этот коллбэк не дает ровным счетом ничего.

Поэтому если стоит задача - тупо считать все сертификаты "хорошими" и не морочить голову этими секретностями, то true -правильный вариант.
В конце концов пользователь знает, каким сервером пользуется, а все эти невалидные сертификаты - головная боль, которую этот код прекрасно обходит, предупреждения в логе думаю достаточно.
А вот кэшировать - это уже лезть в систему. Обходит, систему не гадит, отлично.

===
по поводу "распечатки ошибки" пока не врубился.

Но зато убедился в том что с .Net 2 код тоже работает (были сомнения, в доках только ссылка на 3.5).
...
Рейтинг: 0 / 0
SSL:Удаленный сертификат недействителен согласно результатам проверки подлинности.
    #38966938
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buser2. В хендлере ServerCertificateValidationCallback https://msdn.microsoft.com/ru-ru/library/ms145055(v=vs.110).aspx + https://msdn.microsoft.com/ru-ru/library/system.security.cryptography.x509certificates.x509chain.chainstatus(v=vs.110).aspx

В примере для C++ (не для C#)
https://msdn.microsoft.com/ru-ru/library/system.net.security.remotecertificatevalidationcallback(v=vs.110).aspx
есть некая рукописная конструкция
static void InitializeCertificateErrors + static String^ CertificateErrorDescription(UInt32 problem)
но каким боком она соотносится к sslPolicyErrors в CallBack,
который приведен в том же листинге,
я в упор не вижу.
Может кто-то понял как уточненную ошибку выловить?


Насколько я глядел на sslPolicyErrors, я могу сказать что может быть всего 3 разных ошибки, при этом флаги могут комбинироваться.
Так чтоб программно выудить Description, такого я не вижу, поэтому свой текст похожий на правду.
Ну сделал так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
   Private Function ValidateServerCertificate(ByVal sender As Object, ByVal certificate As X509Certificate, _
     ByVal chain As X509Chain, ByVal sslPolicyErrors As SslPolicyErrors) As Boolean

      If sslPolicyErrors = sslPolicyErrors.None Then
        Return True
      End If

      If (sslPolicyErrors Or sslPolicyErrors.RemoteCertificateChainErrors) = sslPolicyErrors Then _
        CallWarning("ValidateServerCertificate", "", "The remote certificate is invalid according to the validation procedure.")
      If (sslPolicyErrors Or sslPolicyErrors.RemoteCertificateNameMismatch) = sslPolicyErrors Then _
        CallWarning("ValidateServerCertificate", "", "The remote certificate common name is not identical to the server name.")
      If (sslPolicyErrors Or sslPolicyErrors.RemoteCertificateNotAvailable) = sslPolicyErrors Then _
        CallWarning("ValidateServerCertificate", "", "The remote certificate is not available.")

      ' Accept all certificates
      CallWarning("ValidateServerCertificate", "", "Certificate errors ignored.")
      Return True
    End Function



В дебаге выглядит так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
23.05.2015 8:48:50	server.com	   Connect at port 993
23.05.2015 8:48:50	server.com	   Get SSL connection
23.05.2015 8:48:50	server.com	   Get SSL authentication
23.05.2015 8:48:50	server.com	!! The remote certificate is invalid according to the validation procedure.
23.05.2015 8:48:50	server.com	!! The remote certificate common name is not identical to the server name.
23.05.2015 8:48:50	server.com	!! Certificate errors ignored.
23.05.2015 8:48:50	server.com	Rx '* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE 
THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE AUTH=PLAIN ACL ACL2=UNION]
 Courier-IMAP ready. Copyright 1998-2010 Double Precision, Inc.  See COPYING for distribution information.'
...
Рейтинг: 0 / 0
SSL:Удаленный сертификат недействителен согласно результатам проверки подлинности.
    #38966949
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, нет, немножко можно "уточнить" ошибку:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
      If (sslPolicyErrors Or sslPolicyErrors.RemoteCertificateChainErrors) = sslPolicyErrors Then
        CallWarning("ValidateServerCertificate", "", "The remote certificate is invalid according to the validation procedure.")
        If chain.ChainStatus.Length <> 0 Then
          For Each objChainStatus As X509ChainStatus In chain.ChainStatus
            CallTrace("   " + objChainStatus.Status.ToString() + " - " + Replace(objChainStatus.StatusInformation, vbCrLf, ""))
          Next
        End If
      End If
      If (sslPolicyErrors Or sslPolicyErrors.RemoteCertificateNameMismatch) = sslPolicyErrors Then _
        CallWarning("ValidateServerCertificate", "", "The remote certificate common name is not identical to the server name.")
      If (sslPolicyErrors Or sslPolicyErrors.RemoteCertificateNotAvailable) = sslPolicyErrors Then _
        CallWarning("ValidateServerCertificate", "", "The remote certificate is not available.")

      ' Accept all certificates
      CallWarning("ValidateServerCertificate", "", "Certificate errors ignored.")
      Return True



Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
23.05.2015 9:55:13	server.com	   Connect at port 993
23.05.2015 9:55:13	server.com	   Get SSL connection
23.05.2015 9:55:13	server.com	   Get SSL authentication
23.05.2015 9:55:13	server.com	!! The remote certificate is invalid according to the validation procedure.
23.05.2015 9:55:13	server.com	   PartialChain - Не удается построить цепочку сертификатов для доверенного корневого центра.
23.05.2015 9:55:13	server.com	!! The remote certificate common name is not identical to the server name.
23.05.2015 9:55:13	server.com	!! Certificate errors ignored.
23.05.2015 9:55:13	server.com	Rx '* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE 
...
Рейтинг: 0 / 0
SSL:Удаленный сертификат недействителен согласно результатам проверки подлинности.
    #38967148
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77еще правда есть Net.Mail и CDO где ssl "встроенное"

Для Net.Mail (STARTTLS, 587 или 25 порт) я нашел решение, подогнал под тот же Callback:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
    Try
      Dim client As New SmtpClient("server.com", 25) '587
       client.Credentials = New System.Net.NetworkCredential("user@server.com", "password")
      client.EnableSsl = True

      Dim message As New MailMessage(New MailAddress("user@server.com"), New MailAddress("friend@gmail.com"))
      message.Body = "Test body"
      message.Subject = "Test subject"
       ServicePointManager.ServerCertificateValidationCallback = _
       New RemoteCertificateValidationCallback(AddressOf ValidateServerCertificate) 'включаем коллбэк 
      client.Send(message)
      MsgBox("OK")
    Catch
      MsgBox(Err.Description)
    End Try
    ServicePointManager.ServerCertificateValidationCallback = Nothing 'отключаем коллбэк

  Private Function ValidateServerCertificate(ByVal sender As Object, ByVal certificate As X509Certificate, _
   ByVal chain As X509Chain, ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
    ' Accept all certificates
    Return True
  End Function



А вот если нужен Implicit-режим, т.е. CDO.Message, оно же Web.Mail (465-й порт),
то такой же трюк не работает:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
    ServicePointManager.ServerCertificateValidationCallback = _
     New RemoteCertificateValidationCallback(AddressOf ValidateServerCertificate)
    Try
      Dim o_Mess As Object = CreateObject("CDO.Message")
      Dim v_Conf As String = "http://schemas.microsoft.com/cdo/configuration/"
      With o_Mess
        '===(В-1)код необходим для добавления utf-8 в Subject(если .AddAttachment стоит до .TextBodyPart.Charset)===
        .BodyPart.Charset = "utf-8"
        '===(В-1)код необходим для добавления utf-8 в Subject(если .AddAttachment стоит до .TextBodyPart.Charset)===
        .To = "Получатель<friend@gmail.com"
        .From = "Отправитель<user@server.com>;"
        .Subject = "Тема сообщения"
        .TextBody = "Текст сообщения"
        .TextBodyPart.Charset = "utf-8"
        With .Configuration.Fields
          .item(v_Conf & "sendusing") = 2
          .item(v_Conf & "smtpserver") = "server.com"
          .item(v_Conf & "smtpserverport") = 465 '25 либо 465
          .item(v_Conf & "smtpauthenticate") = 1 '1-использовать
          .item(v_Conf & "sendusername") = "user@server.com"
          .item(v_Conf & "sendpassword") = "password"
          .item(v_Conf & "smtpusessl") = True 'использовать SSL
          .item(v_Conf & "smtpconnectiontimeout") = 60 'пока считаем что 60, потом м.б. добавим параметр
          .Update()
        End With
        .Send()
      End With
      MsgBox("Test mail was sent successfully!", vbInformation + vbOKOnly, "Email was sent")
    Catch
      MsgBox("Sending mail...Failed." & vbCrLf & "Error code: " & Err.Number & vbCrLf & Err.Description, _
       vbCritical + vbOKOnly, "Sending mail failed.")
    End Try
    ServicePointManager.ServerCertificateValidationCallback = Nothing


На результат не влияет:
Код: vbnet
1.
-2147220973 Транспорту не удалось подключиться к серверу.



Как работает ServicePointManager.ServerCertificateValidationCallback я разобрался методом полутыка.
Когда его назначаешь,
1) любая проверка сертификата, запрашиваемая этим приложением ,
сваливается в коллбек.
2) можно отключить установив в Nothing (что думаю разумно сразу после)
3) на другие приложения не распространяется , специально запускал второй экземпляр без коллбэка, при "активированном" первом там ничего не работало.

Почему не работает применительно к CDO (и к Web.Mail кстати тоже, нашел где-то на форумах), в принципе понятно.
CDO -это COM, "другое приложение" (причем не .Net-овское), а на другое типа не срабатывает.

Нельзя как-то влезть?
Своего в объектной модели CDO на эту тему ничего не вижу, обернуть в CallBack в лоб не получается.
...
Рейтинг: 0 / 0
SSL:Удаленный сертификат недействителен согласно результатам проверки подлинности.
    #38967354
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
ServicePointManager.ServerCertificateValidationCallback = _
     New RemoteCertificateValidationCallback(AddressOf ValidateServerCertificate)



А какие WiN API этому соответствуют?
Я не знаю, никогда этих тем ранее не копал.
Из .Net-сорцов ничего не понятно.
Мне надо установить подобный Callback на другой процесс соответствующий COM -объекту CDO.Message.
Вот попробовал у классиков спросить:
Callback для проверки подлинности сертификата сервера при использовании SSL (API, C/C++)
...
Рейтинг: 0 / 0
SSL:Удаленный сертификат недействителен согласно результатам проверки подлинности.
    #38967455
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
ServicePointManager.ServerCertificateValidationCallback = Nothing 'отключаем коллбэк

Я думаю это лишнее,
при асинхронной отправке через Net.Mail, может случиться ситуация отправки двух или более писем подряд (если снимать из самого коллбэка или из коллбэка .SendMailAsync).
При этом первое - проскочит, а второе завернется, т.к. ServerCertificateValidationCallback будет уже снят на момент необходимости его вызова.

Думаю, что приемлимый вариант - установить один раз при старте приложения, ну или больше склоняюсь к такому коду:

Код: vbnet
1.
2.
3.
4.
5.
6.
          'Активируем CallBack отключения проверки сертификата SSL сервера если еще не активирован (при необходимости)
          If m_smtp_UseSSL Then
            If System.Net.ServicePointManager.ServerCertificateValidationCallback Is Nothing Then _
             System.Net.ServicePointManager.ServerCertificateValidationCallback = _
             New RemoteCertificateValidationCallback(AddressOf ValidateServerCertificate)
          End If


(перед вызовом .SendMail/.SendMailAsync и не пытаться его снять где-то после)

А на CDO.Message наверно забью, надо уже закругляться с этими мыльными модернизациями.
...
Рейтинг: 0 / 0
SSL:Удаленный сертификат недействителен согласно результатам проверки подлинности.
    #38968128
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
SSL:Удаленный сертификат недействителен согласно результатам проверки подлинности.
    #38968157
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buser,

опаньки, спа-си-бо!!!
а я то ведь в совсем другую главу MSDN смотрел
WinHttpSetStatusCallback,
WINHTTP_STATUS_CALLBACK function pointer
WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CERT
WINHTTP_CALLBACK_STATUS_FLAG_CERT_REVOKED

темный лес пока, но и не с таким разбирались

А как думаешь навскидку, я же напрямую в эту кухню не лезу, у меня COM объект CDO.Message
На него эту ловушку в принципе выставить можно (Net-овская же ловушка на него не действует)?
...
Рейтинг: 0 / 0
SSL:Удаленный сертификат недействителен согласно результатам проверки подлинности.
    #38968186
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, не уверен... попробуйте... может проще закачать сертификат и в трасты добавить?
...
Рейтинг: 0 / 0
SSL:Удаленный сертификат недействителен согласно результатам проверки подлинности.
    #38968297
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buser,

Ну вот такой код накатал без деталей :
В Form1_Load на WinHttpConnect Callback ловится (сессия hSession)
А в ButtonConnect_Click - НЕ ловится сколько не жми (чужая сессия hSession_l), если заменить на hSession то понятно ловится.
На CDO и даже на Net.Mail - не ловит.
Т.е. эта штука только на свою сессию ставится,
а мне надо на чужую, типа глобальный хак.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
  Public Const WINHTTP_ACCESS_TYPE_DEFAULT_PROXY = 0
  Public Const WINHTTP_NO_PROXY_NAME = 0
  Public Const WINHTTP_NO_PROXY_BYPASS = 0

  Public Declare Function WinHttpCloseHandle Lib "winhttp.dll" _
   (ByVal hInternet As IntPtr) As Boolean
  Public Declare Function WinHttpOpen Lib "winhttp.dll" _
   (ByVal pwszUserAgent As String, ByVal dwAccessType As Integer, ByVal pwszProxyName As String, _
   ByVal pwszProxyBypass As String, ByVal dwFlags As Integer) As IntPtr

  Public Delegate Sub WINHTTP_STATUS_CALLBACK_Delegate(ByVal hInternet As IntPtr, _
    ByVal dwContext As IntPtr, ByVal dwInternetStatus As IntPtr, _
    ByVal lpvStatusInformation As IntPtr, ByVal dwStatusInformationLength As Integer)

  Public Const WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS As UInteger = &HFFFFFFFFUI

  Public Declare Function WinHttpSetStatusCallback Lib "winhttp.dll" _
   (ByVal hInternet As IntPtr, ByVal lpfnInternetCallback As WINHTTP_STATUS_CALLBACK_Delegate, _
   ByVal dwNotificationFlags As UInteger, ByVal dwReserved As IntPtr) As WINHTTP_STATUS_CALLBACK_Delegate

  Public Declare Function WinHttpConnect Lib "winhttp.dll" _
   (ByVal hSession As IntPtr, ByVal pswzServerName As String, ByVal nServerPort As Integer, _
   ByVal dwReserved As Integer) As IntPtr

  Dim hSession As IntPtr

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    hSession = WinHttpOpen("A WinHTTP Example Program/1.0",
                                    WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
                                    WINHTTP_NO_PROXY_NAME,
                                    WINHTTP_NO_PROXY_BYPASS, 0)
    If (hSession) Then
      ' Install the status callback function.
      WinHttpSetStatusCallback(hSession, _
       AddressOf WINHTTP_STATUS_CALLBACK, WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS, IntPtr.Zero)

      'Place additional code here.
      WinHttpConnect(hSession, "server.com", 993, 0)

      ''When finished, release the HINTERNET handle.
      'WinHttpCloseHandle(hSession)
    Else
      Debug.Print("Error in WinHttpOpen.")
    End If

  End Sub

  Private Sub ButtonConnect_Click(sender As Object, e As EventArgs) Handles ButtonConnect.Click
    Dim hSession_l As IntPtr = WinHttpOpen("A WinHTTP Example Program/1.0",
                                    WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
                                    WINHTTP_NO_PROXY_NAME,
                                    WINHTTP_NO_PROXY_BYPASS, 0)
    WinHttpConnect(hSession_l, "server.com", 993, 0)

  End Sub

  Public Sub WINHTTP_STATUS_CALLBACK(ByVal hInternet As IntPtr, _
    ByVal dwContext As IntPtr, ByVal dwInternetStatus As IntPtr, _
    ByVal lpvStatusInformation As IntPtr, ByVal dwStatusInformationLength As Integer)
    Debug.Print("WINHTTP_STATUS_CALLBACK")
  End Sub


buser.. может проще закачать сертификат и в трасты добавить?
я думаю, программой добавлять за пользователя сертификаты в хранилище, да еще невалидные - это уже перебор,
хватит того итак уже научил молча обходить "защиту" (в 3-х из 4-х случаев успешно: POP3, IMAP и Net.Mail).

Можно конечно вместо CDO-шного .Send тупо получить .eml как стринг (из CDO) и написать еще один класс для SMTP (как сделал для POP3/IMAP, думаю там команды еще проще) и тогда все в моих руках, но кажется итак уже увлекся.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / SSL:Удаленный сертификат недействителен согласно результатам проверки подлинности.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]