Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.99/75: Рейтинг темы: голосов - 75, средняя оценка - 4.99
тыжПрограммист
330 / 144 / 44
Регистрация: 21.04.2014
Сообщений: 638
1

Пример защищённого соединения socket OpenSSL

24.11.2016, 14:42. Показов 13748. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Прошу поделиться простеньким примером использования OpenSSL и создания самопальных сертификатов для установки защищённых соединений под Windows.
С библиотеками вроде как разобрался..Простой клиент-сервер на Winsocks написал..а как с openSSL подружить не знаю. Нашёл пример на stackoverflow но так и не смог его довести до рабочего состояния.
Вот код сервера
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
61
62
63
64
65
66
67
68
69
70
71
void InitializeSSL()
{
    SSL_load_error_strings();
    SSL_library_init();
    OpenSSL_add_all_algorithms();
}
 
void DestroySSL()
{
    ERR_free_strings();
    EVP_cleanup();
}
 
void ShutdownSSL(SSL* ssl)
{
    SSL_shutdown(ssl);
    SSL_free(ssl);
}
 
SOCKET socketInit()
{
    SOCKET      s;
    WSADATA     ws;
    sockaddr_in sock_bind;
    WSAStartup(0x0002, &ws);
    s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    ZeroMemory(&sock_bind, sizeof(sock_bind));
    sock_bind.sin_family = PF_INET;
    sock_bind.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    sock_bind.sin_port = htons(1234);
    bind(s, (sockaddr*)&sock_bind, sizeof(sock_bind));
 
    return s;
}
 
SOCKET startListen(SOCKET s)
{
    SOCKET new_conn;
    sockaddr_in new_ca;
    listen(s, MAX_CONN);
    cout << "Wait new connections" << endl;
    ZeroMemory(&new_ca, sizeof(new_ca));
    int size = sizeof(new_ca);
    new_conn = accept(s, (sockaddr*)&new_ca, (int*)&size);
    cout << "Client connected" << endl;
    cout << "Client IP = " << inet_ntoa((in_addr)new_ca.sin_addr) << endl;
    cout << "Client PORT = " << ntohs(new_ca.sin_port) << endl;
 
 
    ////////////////////////
    SSL_CTX *sslctx;
    SSL *cSSL;
 
    InitializeSSL();
    sslctx = SSL_CTX_new(SSLv23_server_method());
    SSL_CTX_set_options(sslctx, SSL_OP_SINGLE_DH_USE);
    int use_cert = SSL_CTX_use_certificate_file(sslctx, "/serverCertificate.pem", SSL_FILETYPE_PEM);
 
    int use_prv = SSL_CTX_use_PrivateKey_file(sslctx, "/serverCertificate.pem", SSL_FILETYPE_PEM);
 
    cSSL = SSL_new(sslctx);
    SSL_set_fd(cSSL, new_conn);
    //Here is the SSL Accept portion.  Now all reads and writes must use SSL
    int ssl_err = SSL_accept(cSSL);
    if (ssl_err <= 0)
    {
        cout << "SSL ERR" << endl;
        ShutdownSSL(cSSL);
    }
    return new_conn;
}
Код клиента
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
void InitializeSSL()
{
    SSL_load_error_strings();
    SSL_library_init();
    OpenSSL_add_all_algorithms();
}
 
void DestroySSL()
{
    ERR_free_strings();
    EVP_cleanup();
}
 
void ShutdownSSL(SSL* ssl)
{
    SSL_shutdown(ssl);
    SSL_free(ssl);
}
 
SOCKET socketInit()
{
    SOCKET      s;
    WSADATA     ws;
    sockaddr_in sock_bind;
 
    if (FAILED(WSAStartup(0x0002, &ws))) return E_FAIL;
 
    if (INVALID_SOCKET == (s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)))
        ZeroMemory(&sock_bind, sizeof(sock_bind));
 
    sock_bind.sin_family = PF_INET;
    sock_bind.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    sock_bind.sin_port = htons(1234);
    connect(s, (sockaddr *)&sock_bind, sizeof(sock_bind));
 
 
    SSL_CTX *sslctx;
    SSL *cSSL;
 
    InitializeSSL();
    sslctx = SSL_CTX_new(SSLv23_server_method());
    SSL_CTX_set_options(sslctx, SSL_OP_SINGLE_DH_USE);
    int use_cert = SSL_CTX_use_certificate_file(sslctx, "/serverCertificate.pem", SSL_FILETYPE_PEM);
 
    int use_prv = SSL_CTX_use_PrivateKey_file(sslctx, "/serverCertificate.pem", SSL_FILETYPE_PEM);
 
    cSSL = SSL_new(sslctx);
    SSL_set_fd(cSSL, s);
    //Here is the SSL Accept portion.  Now all reads and writes must use SSL
    int ssl_err = SSL_accept(cSSL);
    if (ssl_err <= 0)
    {
        cout << "SSL ERR" << endl;
        ShutdownSSL(cSSL);
    }
    return s;
}
Соединение вроде как устанавливает через Winsock, а как дальше - не знаю.. Нормального туториала не могу найти.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.11.2016, 14:42
Ответы с готовыми решениями:

Ошибка при установлении защищённого соединения
Всем привет! Ситуация следующая: с относительно недавних пор (где-то около недели) некоторые сайты...

Не могу обработать запрос от защищённого соединения к незащищённому
Привет всем, не могу найти выход из положения. Есть два сайта, один защищённый второй нет. Два...

Установка защищенного соединения с sql server 2008
Вообщем вопрос следующий, где брать ssl сертификат для локальной сети?

Решение защищенного соединения через прокси-сервер
Задача: использование прокси с IP другой страны для проведения операций с https соединением....

4
Заблокирован
25.11.2016, 00:12 2
Кликните здесь для просмотра всего текста
Пример защищённого соединения socket OpenSSL
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
25.11.2016, 14:17 3
Лучший ответ Сообщение было отмечено LonerZzz как решение

Решение

Цитата Сообщение от LonerZzz Посмотреть сообщение
Нормального туториала не могу найти.
Его и нет.

1. Читай инструкцию к OpenSSL.
Генерировать сертификаты и ключи можно и программно, и через командную строку.
Например, я использовал следующие функции для программного создания
сертификата TLS/SSL и ключей для него:

RSA_generate_key, EVP_PKEY_new, EVP_PKEY_assign_RSA, X509_new, X509_set_version,
X509_set_notBefore, X509_set_notAfter, X509_set_pubkey, X509_set_subject_name,
X509_get_subject_name, X509V3_set_ctx, X509V3_EXT_conf, X509_add_ext,
X509_get_ext_by_NID, X509_get_ext и т.д.

Справка по этим функциям есть в OpenSSL.

2. Для начала лучше не заморачиваться с ключами и сертификатами, а попробовать
подключиться по TLS/SSL к какому-нибудь серверу в интернете, например Google (порт 443).

3. Рекомендую использовать связку Boost.Asio + OpenSSL, это достаточно удобный
способ писать клиенты и серверы, работающие через защищенное соединение.
2
6 / 5 / 1
Регистрация: 02.10.2011
Сообщений: 111
04.01.2017, 16:43 4
Цитата Сообщение от Убежденный Посмотреть сообщение
1. Читай инструкцию к OpenSSL.
Где ее читать? Пожалуйста киньте ссылку.
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
04.01.2017, 16:48 5
OpenSSL Documentation
https://www.openssl.org/docs/

FAQ
https://www.openssl.org/docs/faq.html

SSL Library (OpenSSL 1.1.0)
https://www.openssl.org/docs/man1.1.0/ssl/

Network Security with OpenSSL
http://shop.oreilly.com/product/9780596002701.do

OpenSSL Cookbook
https://www.feistyduck.com/books/openssl-cookbook/

Boost.Asio SSL
http://www.boost.org/doc/libs/... erview.ssl
0
04.01.2017, 16:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.01.2017, 16:48
Помогаю со студенческими работами здесь

Потеря соединения TClient Socket - TServer Socket
После коннекта клиента к серверу минут 20 соединение живёт и клиенты получают сообщения через...

Некоторые сайты выдают :Ошибка при установлении защищённого соединения
Здравствуй, Несколько дней давно используемый сайт стал выдавать с любого браузера на...

Приведите пример простейшего OpenSSL-клиента с шифрованным соединением
Здравствуйте!Я решил написать программу,которая отправляет електронную почту и столкнулся с одной...

Разрыв соединения и socket
В проекте использую клиент VNC с открытым исходным кодом TightVNC, в нем для обмена по сети...

Проверка Socket на наличие соединения
Помогите сделать проверку сокета перед подключением. public void onClick(View view) { if...

Как получить все открытые соединения через Socket
Здравствуйте. У меня есть форма, в которой по нажатию кнопки создается объект Socket и...


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

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