Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 25.05.2015
Сообщений: 39

Smtps протокол или как происходит процесс установки ssl/tls

09.10.2016, 15:25. Показов 1797. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решил разобраться с протоколом smtps, да и в принципе с системой соглашений различных протоколов.
Первым делом, естесна, написал прототип на python
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from smtplib import SMTP_SSL
 
def main():
    SMTPServer = 'smtp.mail.ru'
    PROTOCOL = 465
    USERNAME = 'some_mail@mail.ru'
    PASSWORD = 's0me_pa$$w0rd'
 
    try:
        conn = SMTP_SSL(SMTPServer, PROTOCOL)
        conn.login(USERNAME, PASSWORD)
        conn.close()
        print 'OK!'
 
    except Exception, exc:
        print str(exc)
 
main()
Далее, я начал переносить все на c++. Для начала, решил обойтись без всяких библиотек типа boost, openssl(пока нету навыков работы с ними) и платного закрытого решения от chilkatsoft.
Установил tcp соединение средствами winsock`етов. И... на этом все остановилось:
C++
1
2
3
4
5
6
7
8
9
if (SOCKET_ERROR == (connect(s, (struct sockaddr*)&sin, sizeof(sin)))) //все ок, ошибок нету. Соединение установлено.
{
    cout << "_3_" << endl;
    _getch();
    return 1;
}
 
recv(s, buff, RECV_BUFF_SIZE, 0); //доходит до сюда и зависает (сервер молчит)
cout << endl << buff << endl;
Соответственно, почитал статьи про tls, протокол Диффи-Хеллмана, ssl, smtp и smtps.
И у меня возникло недопонимание:
Тут сказано, что сервер должен отправить мне сообщение(tls). Но ведь он молчит!!!! Быть может, он хочет, чтобы я ему чего-то отправил?

Полный исходник, если надо:
C++
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
#include <iostream>
#include <string>
#include <vector>
#include <conio.h>
#include <windows.h>
#include <winsock.h>
 
#pragma comment(lib, "ws2_32.lib")
 
#define DEFAULT_DOMAIN "smtp.mail.ru"
#define DEFAULT_PORT 465 
#define RECV_BUFF_SIZE 1024
using namespace std;
 
int main()
{
    WSAData ws;
    SOCKET s;
    hostent *host;
    SOCKADDR_IN sin;
    char buff[RECV_BUFF_SIZE];
 
    if (FAILED(WSAStartup(MAKEWORD(1, 1), &ws)))
    {
        cout << WSAGetLastError << endl;
        _getch();
        return 1;
    }
 
    s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (SOCKET_ERROR == s)
    {
        cout << "_2_" << endl;
        _getch();
        return 1;
    }
 
    host = gethostbyname(DEFAULT_DOMAIN);
 
    ZeroMemory(&sin, sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_port = htons(DEFAULT_PORT);
    memcpy(&sin.sin_addr, host->h_addr, host->h_length);
 
    if (SOCKET_ERROR == (connect(s, (struct sockaddr*)&sin, sizeof(sin))))
    {
        cout << "_3_" << endl;
        _getch();
        return 1;
    }
 
    recv(s, buff, RECV_BUFF_SIZE, 0); //доходит до сюда и зависает (сервер молчит)
    cout << endl << buff << endl;
 
    cout << endl << "end!" << endl;
    closesocket(s);
    WSACleanup();
    _getch();
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.10.2016, 15:25
Ответы с готовыми решениями:

SSL или TLS - кодировка (протокол)
Здравствуйте. Помогите разобраться. Имеется сервер, созданный на С++ (через сокеты в консольном приложении). Могу принимать и...

SMTP, SSL, TLS
Здравствуйте, устанавливаю соединение с smtp.mail.ru, получаю - 220 smtp42.i.mail.ru ESMTP ready (Looking for Mail for your domain? Visit...

Чем отличаются TLS и SSL
В чем конкретные отличия, и почему TLS лучше SSL?

5
1 / 1 / 0
Регистрация: 25.05.2015
Сообщений: 39
09.10.2016, 15:38  [ТС]
На офф сайте говорится, что портом и для tls, и для ssl служит 465. Но здесь сказано, что для tls и ssl предусмотрены разные порты(465 - ssl, 587 - tls). Попробовал сделать коннект к 587 - приходит ответ: см вложение. Те был просто не тот порт?
Миниатюры
Smtps протокол или как происходит процесс установки ssl/tls  
0
1 / 1 / 0
Регистрация: 25.05.2015
Сообщений: 39
09.10.2016, 15:54  [ТС]
Если отправить команду HELO или EHLO, то приходит ошибка 500
C++
1
2
3
4
5
6
7
8
recv(s, buff, RECV_BUFF_SIZE, 0); //отвечает 220 статусом (готов к работе)
cout << endl << buff << endl;
ZeroMemory(&buff, sizeof(buff));
 
send(s, "HELO", sizeof("HELO"), 0);
recv(s, buff, RECV_BUFF_SIZE, 0);  //500 ошибка
cout << endl << buff << endl;
ZeroMemory(&buff, sizeof(buff));
Миниатюры
Smtps протокол или как происходит процесс установки ssl/tls  
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
09.10.2016, 16:12
Цитата Сообщение от dima291000 Посмотреть сообщение
что для tls и ssl предусмотрены разные порты(465 - ssl, 587 - tls)
ssl - сразу устанавливается защищенное соединение.
starttls - устанавливается обычное соединение, а после специального запроса (starttls) - защищенное.
StartTLS - более современное решение и не требует отдельных портов для открытой и защищенной передачи данных.
Цитата Сообщение от dima291000 Посмотреть сообщение
решил обойтись без всяких библиотек типа boost, openssl
Это проблематично ввиду сложности реализации алгоритмов. Вы можете обойтись без библиотек высокого уровня (boost Asio, curl, Qt...), но одна из библиотек шифрования (OpenSSL, GnuTLS, LibreSSL...) вам понадобится. Даже перечисленные библиотеки высокого уровня используют одну из них (обычно openssl), а не собственные велосипеды.
0
1 / 1 / 0
Регистрация: 25.05.2015
Сообщений: 39
09.10.2016, 16:43  [ТС]
Цитата Сообщение от gng Посмотреть сообщение
ssl - сразу устанавливается защищенное соединение.
Те сначала все же коннектится сокет, далее обмен сообщениями типа hello, use ssl, public key (условно)?
Еще вопрос, если я привинчу ту же openssl и инициализирую после коннекта сокета - все же заработает? Просто сервер, наверное, ждет ту самую инициализацию.
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
09.10.2016, 22:54
Цитата Сообщение от dima291000 Посмотреть сообщение
Те сначала все же коннектится сокет, далее обмен сообщениями типа hello, use ssl, public key (условно)?
"Открытым текстом" в этом случае не передается НИЧЕГО. (в смысле hello, use ssl и т.п.)
Цитата Сообщение от dima291000 Посмотреть сообщение
Еще вопрос, если я привинчу ту же openssl и инициализирую после коннекта сокета - все же заработает?
Да, если я вас правильно понял.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.10.2016, 22:54
Помогаю со студенческими работами здесь

SSL/TLS в FTP, SMTP, POP3, IMAP
Здравствуйте! Помогите, пожалуйста, разобраться в следующем вопросе. Не получается понять логику, как создается шифрованное...

SSL, TLS и POP3
Друзья-программисты, очень нужна ваша помощь!!! Я бьюсь над созданием почтового клиента(не спрашивайте зачем, знаю что горы их в сети)....

Как заставить работать протокол SSL под PHP 5.2.12
Здравствуйте! Столкнулся недавно с проблемой, не знаю как решить.Прошу помощи. Не работает SSL протокол под php. Текст...

Ssl/Tls криптография, перехват пакетов
Вообщем, создал свой клиент - серверное приложение и использую Ssl/Tls криптографию. Попробовал перехватить данные между клиентом и...

Ssl/Tls криптография, аутентикация клиента
Здравствуйте, вообщем, создал TcpListener, TcpClient, реализовал криптографию, всё работает, всё нормально. На данный момент все клиенты...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru