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

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

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

Author24 — интернет-сервис помощи студентам
Решил разобраться с протоколом 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.10.2016, 15:25
Ответы с готовыми решениями:

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

SMTP, SSL, TLS
Здравствуйте, устанавливаю соединение с smtp.mail.ru, получаю - 220 smtp42.i.mail.ru ESMTP ready...

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

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

5
1 / 1 / 0
Регистрация: 25.05.2015
Сообщений: 39
09.10.2016, 15:38  [ТС] 2
На офф сайте говорится, что портом и для 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  [ТС] 3
Если отправить команду 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 4
Цитата Сообщение от 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  [ТС] 5
Цитата Сообщение от gng Посмотреть сообщение
ssl - сразу устанавливается защищенное соединение.
Те сначала все же коннектится сокет, далее обмен сообщениями типа hello, use ssl, public key (условно)?
Еще вопрос, если я привинчу ту же openssl и инициализирую после коннекта сокета - все же заработает? Просто сервер, наверное, ждет ту самую инициализацию.
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
09.10.2016, 22:54 6
Цитата Сообщение от dima291000 Посмотреть сообщение
Те сначала все же коннектится сокет, далее обмен сообщениями типа hello, use ssl, public key (условно)?
"Открытым текстом" в этом случае не передается НИЧЕГО. (в смысле hello, use ssl и т.п.)
Цитата Сообщение от dima291000 Посмотреть сообщение
Еще вопрос, если я привинчу ту же openssl и инициализирую после коннекта сокета - все же заработает?
Да, если я вас правильно понял.
0
09.10.2016, 22:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.10.2016, 22:54
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru