Callback для проверки подлинности сертификата сервера при использовании SSL (API, C/C++)

Дмитрий77
Дата: 24.05.2015 17:17:21
Приветствую,

Ну, т.е. SMTP клиент по TCP коннектится к серверу используя SSL,
а там его всречают невалидным сертификатом (то же с pop3,imap, https).
По умолчанию клиента разворачивают и он возвращает ошибку.
Но можно задать Callback (как вариант на все приложение), и если Callback возвращает true то клиент продолжает работать с сервером.

Как это делать в .Net я нарыл:
SSL:Удаленный сертификат недействителен согласно результатам проверки подлинности.

ServicePointManager.ServerCertificateValidationCallback = _
     New RemoteCertificateValidationCallback(AddressOf ValidateServerCertificate)

  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

(P.S. Извините за код не на C++, это для иллюстрации того, о чем спрашиваю, а спрашиваю как раз о том как в классике, читай на C++ это делается)

Но я иногда использую COM-объект CDO.Message, и на него этот трюк не проходит, потому что COM это другой процесс.

А вопрос такой:
какие WIN API вызывают этот CallBack в приложении?
как мне эту ловушку выставить?

Я по API конечно любитель большой, но с "проверкой сертификата" только второй день воюю, поэтому как это делается на классике не знаком.
Нет ли каких примеров на C++?
Dimitry Sibiryakov
Дата: 24.05.2015 17:28:07

Дмитрий77
какие WIN API вызывают этот CallBack в приложении?

Не помню я, чтобы в WinAPI были функции работы с SSL вообще. Так что все вопросы - к
документации по используемой тобой библиотеке.

Posted via ActualForum NNTP Server 1.5

Дмитрий77
Дата: 24.05.2015 17:43:03
Dimitry Sibiryakov,

Но вот эта же огромная глава же есть:
Security and Identity

Вопрос то не про SSL а про механизм проверки сертификата на подлинность.
Можно подумать, .Net классы (в которых это есть) не на WIN API основаны.
Ну, можно конечно попытаться сорцы глянуть чего там вызывается.
Dimitry Sibiryakov
Дата: 24.05.2015 17:59:18

Дмитрий77
Но вот эта же огромная глава же есть:

И какой именно кусок этой огромной главы ты пытаешься использовать?

Posted via ActualForum NNTP Server 1.5

Дмитрий77
Дата: 24.05.2015 19:41:22
Dimitry Sibiryakov
И какой именно кусок этой огромной главы ты пытаешься использовать?


Дмитрий,
если б я знал, то я бы пытался использовать а не задавал бы тут этот вопрос.

Исходники подобного для .Net как бы есть:
http://referencesource.microsoft.com/#q=RemoteCertificateValidationCallback
но ни на какие API намеков я там не вижу, как обычно бывает.

Меня конкретно интересует обернуть в эту штуковину системный COM объект CDO.Message (sdosys.dll), но внутренних методов, событий и т.п. позволяющих это сделать через сам COM он не предоставляет, или я не узрел.

Т.е. в определенный момент винды вызывают проверку сертификата удаленного сервера. В процедуру этой проверки надо влезть, ну например вывести диалог, согласиться ли с недостоверным сертификатом, или сразу ответить ДА (практически все почтовые программы типа Outlook/Outlook Express такой диалог выводят в соответствующих случаях). По умолчанию, если не влезать, ответ будет НЕТ, т.е. приложение не сможет отправить почту через подобный сервер.

Вот картинка чтоб понятней было о чем речь идет:
Дмитрий77
Дата: 24.05.2015 19:55:33
М.б. вот это
Certificate Policy Server Interfaces

но не уверен, и хотелось бы именно API как функции.
Дмитрий77
Дата: 24.05.2015 20:17:53
Вот кажется что-то похожее:
CertChainFindByIssuerCallback callback function
Дмитрий77
Дата: 25.05.2015 19:38:14
Dimitry Sibiryakov
Не помню я, чтобы в WinAPI были функции работы с SSL вообще.

Да?
Добрый человек наводку дал.
17687222

WINHTTP_STATUS_CALLBACK function pointer

MSDN
WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CERT
SSL certificate is invalid.

WINHTTP_CALLBACK_STATUS_FLAG_CERT_REVOKED
SSL certificate was revoked.

WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CA
The function is unfamiliar with the Certificate Authority that generated the server's certificate.

WINHTTP_CALLBACK_STATUS_FLAG_CERT_CN_INVALID
SSL certificate common name (host name field) is incorrect, for example, if you entered www.microsoft.com and the common name on the certificate says www.msn.com.

WINHTTP_CALLBACK_STATUS_FLAG_CERT_DATE_INVALID
SSL certificate date that was received from the server is bad. The certificate is expired.

WINHTTP_CALLBACK_STATUS_FLAG_SECURITY_CHANNEL_ERROR
The application experienced an internal error loading the SSL libraries.



Пока не разбирался, но вот думаю, я ж напрямую в API не лезу, у меня COM объект CDO.Message,
он лезет.
Т.е. вот можно ли на него эту ловушку в принципе выставить? (Net-овская ловушка на него не действует).