Компилируемый код C++ для реализации защищенного клиента SLL/TLS с использованием MS SSPI.

Как описано здесь http://www.ddj.com/cpp/184401688.

У меня нет времени писать это с нуля.

Спросили и не ответили https://stackoverflow.com/questions/434961/implementing-ssl

ВОПРОС:

Я ищу некоторый компилируемый рабочий исходный код, который реализует MS SSPI (как упоминалось в ветке выше), предпочтительно процедурный, а не ООП.

Я просмотрел пример проектов кода здесь:

http://www.codeproject.com/KB/IP/sslclasses.aspx

Но это С# ООП. Преобразование этого в код C++ не является тривиальным.

Открытый SSL

Вызовы SChannel соответствуют стандартам GSS API. Есть, конечно, некоторые альтернативы — например, OpenSSL. Этот пакет является полной и тщательной реализацией протокола и для тех, кто слишком хорошо знаком с UNIX, несомненно, является лучшим выбором. Пакет изначально предназначался для сообщества UNIX, и для его компиляции требуется среда выполнения Perl, поэтому разработчикам Windows, которые никогда не работали с системами типа UNIX, требуется некоторая кривая обучения.

Кроме того, OpenSLL делает очень нестандартные вещи.

Николай, Предоставив много компилируемого исходного кода (www.coastrd.com), я надеялся найти кого-то, кто захочет сделать то же самое.


person Mike Trader    schedule 09.01.2010    source источник
comment
Здесь вы не найдете ответа .. может быть, только шуточный ответ с кодом для записи закодированного ssl потока нулей в /dev/null   -  person Frunsi    schedule 09.01.2010
comment
Бамп, ты поймал второй отрицательный голос. Пожалуйста, задайте вопрос лучше. Вы не хотите OpenSSL, это нормально. Затем используйте MS SSPI. Или напишите свою собственную реализацию SSL/TLS.   -  person Frunsi    schedule 09.01.2010
comment
Пожалуйста, прочитайте вопрос. Я прошу решения, ИСПОЛЬЗУЮЩЕГО MS SSPI...   -  person Mike Trader    schedule 09.01.2010
comment
Кстати: OpenSSL можно скомпилировать без Perl. Существует make-файл nmake или даже проект VS. Я очень уверен, что я скомпилировал его без Perl год назад.   -  person Frunsi    schedule 09.01.2010
comment
Нет, я не минусовал тебя. Первоначальный вопрос звучал откровенно дайте мне решение прямо сейчас, таким образом, мой ответ.   -  person Nikolai Fetissov    schedule 09.01.2010
comment
Спасибо за ваш отзыв, я постараюсь написать свои вопросы, чтобы они не звучали так. Это определенно НЕ было моим намерением.   -  person Mike Trader    schedule 09.01.2010
comment
Кажется (из ваших комментариев ниже), что процедурный, а не ООП предпочтительный, действительно процедурный, а не ООП требуется   -  person Mark Elliot    schedule 09.01.2010
comment
Так что, если ему нужен Perl, perl бесплатен, легко и без заминок устанавливается на Windows.   -  person President James K. Polk    schedule 09.01.2010


Ответы (4)


Этот пример SSPI SChannel SMTPS должен компилироваться и работать в Visual Studio 2008 как есть.

http://www.coastrd.com/c-schannel-smtp

SChannel — это реализация Microsoft GSS API, обертывающая протокол SSL/TLS.

Преимущества использования SChannel:

  • кровавые подробности скрыты от разработчика SSPI.
  • Для запуска окончательного приложения не требуется дополнительной настройки:
  • SChannel является неотъемлемой частью операционной системы.
  • На платформах Windows ME/2000/XP/... SChannel устанавливается и настраивается по умолчанию.
  • Вызовы SChannel соответствуют стандартам GSS API.
  • Вам не нужно создавать/устанавливать какие-либо сертификаты
  • никаких сторонних dll (1 МБ или больше) для отправки и установки

Код должен создать сеанс, который выглядит следующим образом:

----- Инициализировано SSPI
----- Инициализировано WinSock
----- Инициализированы учетные данные
----- Подключено к серверу
Отправлено 70 байт данных подтверждения
Получено 974 байта данных подтверждения
Отправлено 182 байта данных подтверждения
Получено 43 байта данных подтверждения
Рукопожатие прошло успешно
----- Рукопожатие клиента выполнено
----- Сервер Учетные данные подтверждены

Тема сервера: C=US, S=California, L=Mountain View, O=Google Inc, CN=smtp.gmail.com
Эмитент сервера: C=ZA, S=Western Cape, L=Cape Town, O= Thawte Consulting cc, OU=Certification Services Division, CN=Thawte Premium Server CA, [email protected]

----- Отображается цепочка сертификатов
----- Сертификат сервера проверен
----- Контекст сертификата сервера освобожден

Протокол: TLS1
Шифр: RC4
Стойкость шифра: 128
Хэш: MD5
Стойкость хэша: 128
Обмен ключами: RSA
Стойкость обмена ключами: 1024
--- -- Информация о безопасном соединении
Получено 64 байта (зашифрованных) данных приложения
Расшифровано данных: 43 байта
220 mx.google.com ESMTP 6sm17740567yxg.66

Отправка 7 байт открытого текста:
EHLO

28 байт зашифрованных данных отправлено
169 байт (зашифрованных) полученных данных приложения
Расшифровано данных: 148 байт
250-mx.google.com к вашим услугам, [22.33.111.222]
250- SIZE 35651584
250-8BITMIME
250-AUTH LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250 КОНВЕЙЕРНАЯ

Отправка 7 байт открытого текста:
ВЫЙТИ

28 байт зашифрованных данных отправлено
69 байт (зашифрованных) полученных данных приложения
Расшифровано данных: 48 байт
221 2.0.0 закрытие соединения 6sm17740567yxg.66

----- Сеанс SMTP завершен
Отправка уведомления о закрытии
23 байта данных подтверждения отправлено
----- Отключение от сервера
----- Начать очистку
--- -- Все сделано -----

person Mike Trader    schedule 12.01.2010
comment
Как отправить большой с помощью Schannel. мы пытались, но если данные увеличиваются более чем на 16432, это не удается - person Dnyan Waychal; 31.01.2018

Возможно, эта ссылка является хорошей отправной точкой. Он содержит фактически работающий пример кода с использованием MS SSPI (хотя он выглядит очень специфичным для MSVC, но ладно, в любом случае его окна). Просто игнорируйте примеры OpenSSL ;-)

person Frunsi    schedule 09.01.2010
comment
Спасибо. Я забыл упомянуть об этом. См. выше - person Mike Trader; 09.01.2010
comment
Ну, тогда я больше не могу здесь помочь. Но преобразовать их в императивный код не должно быть слишком сложно. - person Frunsi; 09.01.2010

Повторяйте за мной: "Я хочу использовать OpenSSL".

Эта проблема слишком серьезна, и ее слишком легко испортить, чтобы каждый раз решать ее самостоятельно. Если у вас есть проблема с OpenSSL, попробуйте решить ее с помощью диалога и патчей для OpenSSL.

(Никто не застрахован от того, чтобы все испортить, даже Microsoft или даже OpenSSL. Используйте что-то, чей исходный код вы можете просмотреть и что будет исправлено при возникновении проблем. Используйте OpenSSL.)

person Nick Bastin    schedule 09.01.2010
comment
Если вы настолько привязаны к окнам, то наверняка у вас должна быть учетная запись MSDN и/или контракт на разработку. Если это так, похоже, это именно тот вопрос, за ответ на который мы платим Microsoft. - person Nick Bastin; 09.01.2010
comment
Практически это тот вопрос, на который, вероятно, хотел бы ответить тот, кто действительно разработал решение. См. мои комментарии OpenSLL выше - person Mike Trader; 09.01.2010
comment
К сожалению, OpenSSL не интегрируется с хранилищем криптографии Windows, поэтому, если у вас есть защищенные USB-токены, доступные только через WinSCrypt API, вам необходим SChannel. В противном случае OpenSSL — гораздо лучший выбор. - person Gearoid Murphy; 08.04.2013

Сколько бы вы заплатили за такой компилируемый рабочий исходный код? Или вы ожидали, что кто-то просто даст его вам? Ребята из OpenSSL уже сделали. Это ужасно, но цена правильная.

person Nikolai Fetissov    schedule 09.01.2010
comment
Мой код теперь доступен. Это та же цена, но я надеюсь, что вы найдете его менее уродливым. - person Mike Trader; 12.01.2010