Я реализовал код для создания безопасного соединения с использованием SSPI. Я использую его для отправки почты по SMTP. Он отлично работает с smtp.gmail.com
и некоторыми другими серверами, с которыми я пробовал. Но это не работает с smtp.live.com
. Второй вызов InitializeSecurityContext()
возвращает мне SEC_I_INCOMPLETE_CREDENTIALS
. Насколько я понимаю, это означает, что мне нужно предоставить сертификат клиента. Но это общедоступный бесплатный почтовый сервер. Какой клиентский сертификат он может потребовать?? Или, может быть, я использую какие-то неправильные параметры или флаги?
Подключаюсь к smtp.live.com:587 Изначально соединение незашифрованное, обычный текст. Сначала я отправляю команду EHLO, затем отправляю команду STARTTLS. После этого я выполняю рукопожатие SSL, используя приведенный ниже код.
Вот код:
SCHANNEL_CRED schCred;
memset(&schCred,0,sizeof(schCred));
schCred.dwVersion=SCHANNEL_CRED_VERSION; // == 4
schCred.dwFlags=SCH_CRED_NO_DEFAULT_CREDS;
// acquire credentials
SECURITY_STATUS status=
AcquireCredentialsHandle(NULL,UNISP_NAME,SECPKG_CRED_OUTBOUND,NULL,
&schCred,NULL,NULL,&Creds,NULL);
// then I create a context
const DWORD dwSSPIFlags = ISC_REQ_SEQUENCE_DETECT |
ISC_REQ_REPLAY_DETECT |
ISC_REQ_CONFIDENTIALITY |
ISC_RET_EXTENDED_ERROR |
ISC_REQ_ALLOCATE_MEMORY |
ISC_REQ_STREAM;
SECURITY_STATUS scRet =
InitializeSecurityContextW(&Creds, NULL, targetName, dwSSPIFlags,
0, 0 , NULL, 0, &Context,&outBuffer, &dwSSPIOutFlags, &tsExpiry);
// scRet==SEC_I_CONTINUE_NEEDED
SendOutBuffer(outBuffers);
ReceiveInputBuffers(inBuffers);
// Then I call InitializeSecurityContext for the second time
scRet = InitializeSecurityContext(&Creds, &Context, NULL, dwSSPIFlags,
0, 0, &inBuffer, 0, NULL, &outBuffer, &dwSSPIOutFlags, &tsExpiry);
if( ( SEC_E_OK == scRet || SEC_I_CONTINUE_NEEDED == scRet ||
FAILED(scRet) && (dwSSPIOutFlags & ISC_RET_EXTENDED_ERROR) )
&& BufferNotEmpty(outBuffers)) {
SendOutBuffer(outBuffers);
}
if(SEC_I_INCOMPLETE_CREDENTIALS == scRet) {
// This is where I am when connecting to smtp.live.com
}
220 AM5PR0602CA0024.outlook.office365.com Microsoft ESMTP MAIL Service ready at Thu, 23 Nov 2017 ...
- вообще без шифрования - person RbMm   schedule 23.11.2017QueryContextAttributes
с помощьюSECPKG_ATTR_ISSUER_LIST_EX
. Он вернулSEC_E_OK
. СтруктураSecPkgContext_IssuerListInfoEx
имеет ноль как дляcIssuers
, так и дляaIssuers
. Да, я могу отправлять электронную почту с помощью Thundernird через smtp.live.com, тот же порт - person CITBL   schedule 23.11.2017