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

Сокеты. Отправка GET-запроса по HTTPS и получение ответа от сервера

26.12.2015, 12:00. Показов 8602. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Использую сокеты для отправки GET-запроса и получения HTML-кода запрашиваемой страницы. Все красиво и быстро работает ! С HTTPS у меня возникли проблемы. Отправляю стандартный GET-запрос на порт 443 - в ответ:

Код
HTTP/1.1 400 Bad Request
Server: nginx/1.9.4
Date: Fri, 25 Dec 2015 22:16:08 GMT
Content-Type: text/html
Content-Length: 270
Connection: close
HTML5
1
2
3
4
5
6
7
8
<html>
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<center>The plain HTTP request was sent to HTTPS port</center>
<hr><center>nginx/1.9.4</center>
</body>
</html>
Хочу остаться на уровне сокетов! Понимаю, что нужно шифровать сам запрос. Буду признателен ответу специалиста! Предлагаю сотрудничество на взаимовыгодных условиях!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.12.2015, 12:00
Ответы с готовыми решениями:

Сокеты(отправка байтов серверу и получение ответа)
Нужна книга,в которой будет подробно описана работа с сокетами,т.е добавление байтов CUint и т.д....

Отправка POST запроса и получение ответа
Здравствуйте! Я новичок в java, мне дали задание распарсерить данные (формат json) и отправить их...

Отправка POST запроса в ВК и получение ответа
Пытаюсь загрузить аватар в группу ВК. И при отправке post запроса с изображением, в ответ приходит...

Отправка http запроса и получение ответа
я понимаю что есть дофига тем про это, я честно гуглила и искала, но находила в основном код без...

20
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
26.12.2015, 21:38 2
Лучший ответ Сообщение было отмечено freeollo как решение

Решение

Цитата Сообщение от freeollo Посмотреть сообщение
Хочу остаться на уровне сокетов!
SSL реализован через сокеты. Пишете SSL_write, читаете SSL_read, шифрует библиотека.


В сети достаточно примеров. В упрощенном виде что-то такого типа (использовалась openssl):
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
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netdb.h>
#include <openssl/ssl.h>
 
int main() {   
    char hostname[]="ya.ru";
    int port = 443;
 
    SSL_library_init();
    OpenSSL_add_all_algorithms();
    SSL_load_error_strings();
    const SSL_METHOD *method = SSLv23_client_method();
    SSL_CTX *ctx = SSL_CTX_new(method);
    if ( ctx == NULL ) return -1;
 
    struct hostent *host;
    struct sockaddr_in addr;
 
    if ( (host = gethostbyname(hostname)) == NULL ) return -1;
    int sd = socket(PF_INET, SOCK_STREAM, 0);
    bzero(&addr, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = *(long*)(host->h_addr);
    if ( connect(sd, (struct sockaddr*)&addr, sizeof addr)) return -1;
    
    SSL *ssl = SSL_new(ctx);
    SSL_set_fd(ssl, sd); 
    if ( SSL_connect(ssl) == -1 )  return -1;
 
    char msg[] = "GET [url]https://ya.ru/[/url] HTTP/1.0\n\n";
    char buf[1024];
 
    SSL_write(ssl, msg, strlen(msg)); 
    long bytes;
    while ((bytes = SSL_read(ssl, buf, sizeof buf)) >0 ) {
      buf[bytes] = 0;
      printf("%s", buf);
    }
    printf ("\n");
    SSL_free(ssl);   
    close(sd);      
    SSL_CTX_free(ctx);   
    return 0;
}
Добавлено через 5 минут
PS. Тег [URL] в 33 строке добавлен здешним веб-редактором. Его в тексте не было.
1
0 / 1 / 0
Регистрация: 14.12.2015
Сообщений: 14
29.12.2015, 09:11  [ТС] 3
создал файл https.c
подключил библиотеку openssl
Результат:

gcc -I/root/openssl/openssl-1.0.2e/include -o https https.c
/tmp/cczA3MJJ.o: In function `main':
https.c.text+0x20): undefined reference to `SSL_library_init'
https.c.text+0x25): undefined reference to `OPENSSL_add_all_algorithms_noconf'
https.c.text+0x2a): undefined reference to `SSL_load_error_strings'
https.c.text+0x2f): undefined reference to `SSLv23_client_method'
https.c.text+0x3f): undefined reference to `SSL_CTX_new'
https.c.text+0xf5): undefined reference to `SSL_new'
https.c.text+0x10a): undefined reference to `SSL_set_fd'
https.c.text+0x116): undefined reference to `SSL_connect'
https.c.text+0x190): undefined reference to `SSL_write'
https.c.text+0x1d5): undefined reference to `SSL_read'
https.c.text+0x1f8): undefined reference to `SSL_free'
https.c.text+0x20e): undefined reference to `SSL_CTX_free'
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
29.12.2015, 11:24 4
freeollo, Линкер не находит библиотеку. Если openssl установлена стандартным способом
Bash
1
gcc `pkg-config --cflags --libs openssl` -o https https.c
0
0 / 1 / 0
Регистрация: 14.12.2015
Сообщений: 14
29.12.2015, 16:47  [ТС] 5
а как можно поставит нестандартным способом? Переместить папку openssl в user/include? Можно поставить openssl на Mас os. На сервере не совсем удобно писать скрипты
0
612 / 373 / 69
Регистрация: 21.09.2008
Сообщений: 1,277
29.12.2015, 20:25 6
freeollo, Вы попытались создать исполняемый файл без компоновки библиотеки libopenssl.a опцией -lopenssl и компоновщик ld не смог разрешить внешние ссылки на используемые функции.
Команда вида
gcc -I/root/openssl/openssl-1.0.2e/include -lopenssl -o https https.c
будет иметь смысл только при собранной библиотеке openssl.

Если не секрет, сервер под управлением какой ОС работает?
1
0 / 1 / 0
Регистрация: 14.12.2015
Сообщений: 14
30.12.2015, 00:02  [ТС] 7
Библиотеку собирал запуском на сервере /.config , oн создал include/openssl
Версия OS: Linux version 2.6.32-504.12.2.el6.x86_64

Добавлено через 38 минут
gcc -I/root/openssl/openssl-1.0.2e/include -lopenssl -o https https.c
так отреагировал мой сервер на -lopenssl

/usr/bin/ld: cannot find -lopenssl
0
612 / 373 / 69
Регистрация: 21.09.2008
Сообщений: 1,277
30.12.2015, 04:51 8
Цитата Сообщение от freeollo Посмотреть сообщение
Библиотеку собирал запуском на сервере /.config , oн создал include/openssl
Это отработал скрипт-конфигуратор, создающий Makefile. После его запуска запускали утилиту make?

Цитата Сообщение от freeollo Посмотреть сообщение
Версия OS: Linux version 2.6.32-504.12.2.el6.x86_64
Это ядро. Мне бы точнее узнать дистрибутив Linux: OpenSUSE, Ubuntu, Arch или ещё какой. А в /usr/lib есть libssl.a?

Цитата Сообщение от freeollo Посмотреть сообщение
так отреагировал мой сервер на -lopenssl
/usr/bin/ld: cannot find -lopenssl
Компоновщик не нашёл библиотеку libopenssl.a. Попробуйте указать опцию -Lpath-to-lib где расположен файл libopenssl.a.
0
0 / 1 / 0
Регистрация: 14.12.2015
Сообщений: 14
30.12.2015, 11:20  [ТС] 9
Цитата Сообщение от sharpey Посмотреть сообщение
Это отработал скрипт-конфигуратор, создающий Makefile. После его запуска запускали утилиту make?
запустил - не помогло

Цитата Сообщение от sharpey Посмотреть сообщение
Это ядро. Мне бы точнее узнать дистрибутив Linux: OpenSUSE, Ubuntu, Arch или ещё какой.
# cat /etc/issue
CentOS release 6.6 (Final)

и

# uname -r
2.6.32-504.12.2.el6.x86_64


Цитата Сообщение от sharpey Посмотреть сообщение
А в /usr/lib есть libssl.a?
там такого файла не оказалось, нашел я его в "/root/openssl/openssl-1.0.2e/libssl.a"

файл libopenssl.a команда find не нашла
0
612 / 373 / 69
Регистрация: 21.09.2008
Сообщений: 1,277
30.12.2015, 11:59 10
Попытайтесь теперь так:
gcc -Iroot/openssl/openssl-1.0.2e/include -L/root/openssl/openssl-1.0.2e/ -lssl -o https https.c
0
0 / 1 / 0
Регистрация: 14.12.2015
Сообщений: 14
30.12.2015, 14:54  [ТС] 11
без изменений
# gcc -I/root/openssl/openssl-1.0.2e/include -L/root/openssl/openssl-1.0.2e/ -lssl -o https https.c
/tmp/ccDBzgGT.o: In function `main':
https.c.text+0x20): undefined reference to `SSL_library_init'
https.c.text+0x25): undefined reference to `OPENSSL_add_all_algorithms_noconf'
https.c.text+0x2a): undefined reference to `SSL_load_error_strings'
https.c.text+0x2f): undefined reference to `SSLv23_client_method'
https.c.text+0x3f): undefined reference to `SSL_CTX_new'
https.c.text+0xf5): undefined reference to `SSL_new'
https.c.text+0x10a): undefined reference to `SSL_set_fd'
https.c.text+0x116): undefined reference to `SSL_connect'
https.c.text+0x190): undefined reference to `SSL_write'
https.c.text+0x1d5): undefined reference to `SSL_read'
https.c.text+0x1f8): undefined reference to `SSL_free'
https.c.text+0x20e): undefined reference to `SSL_CTX_free'
collect2: ld returned 1 exit status
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
30.12.2015, 18:02 12
Цитата Сообщение от freeollo Посмотреть сообщение
без изменений
Не хочешь pkg-config, так посмотри, перед тем как строку вбивать, где у тебя реально находится библиотека и как называется.
0
612 / 373 / 69
Регистрация: 21.09.2008
Сообщений: 1,277
30.12.2015, 20:03 13
Лучший ответ Сообщение было отмечено freeollo как решение

Решение

Приведённый пример собрался под FreeBSD 10 после включения заголовка <netinet/in.h>
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
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <openssl/ssl.h>
 
int main() {   
    char hostname[]="ya.ru";
    int port = 443;
 
    SSL_library_init();
    OpenSSL_add_all_algorithms();
    SSL_load_error_strings();
    const SSL_METHOD *method = SSLv23_client_method();
    SSL_CTX *ctx = SSL_CTX_new(method);
    if (ctx == NULL)
      return -1;
 
    struct hostent *host;
    struct sockaddr_in addr;
 
    if ((host = gethostbyname(hostname)) == NULL)
      return -1;
    int sd = socket(PF_INET, SOCK_STREAM, 0);
    bzero(&addr, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = *(long *)(host->h_addr);
    if (connect(sd, (struct sockaddr*)&addr, sizeof addr))
      return -1;
    
    SSL *ssl = SSL_new(ctx);
    SSL_set_fd(ssl, sd); 
    if (SSL_connect(ssl) == -1)
      return -1;
 
    char msg[] = "GET [url]https://ya.ru/[/url] HTTP/1.0\n\n";
    char buf[1024];
 
    SSL_write(ssl, msg, strlen(msg)); 
    long bytes;
    while ((bytes = SSL_read(ssl, buf, sizeof buf)) >0 ) {
      buf[bytes] = 0;
      printf("%s", buf);
    }
    printf("\n");
    SSL_free(ssl);   
    close(sd);      
    SSL_CTX_free(ctx);   
    return 0;
}
и командой
cc -Wall -o https -lssl -lcrypto https.c
Как видите, компонуются два библиотечных модуля libssl.a и libcrypto.a. Подозреваю, что libcrypto.a собирается вместе с libssl.a.
2
0 / 1 / 0
Регистрация: 14.12.2015
Сообщений: 14
31.12.2015, 11:50  [ТС] 14
Цитата Сообщение от gng Посмотреть сообщение
Не хочешь pkg-config, так посмотри, перед тем как строку вбивать, где у тебя реально находится библиотека и как называется.
через pkg-config не получается
# gcc `pkg-config --cflags --libs openssl` -o https https.c
/tmp/ccR2apBI.o: In function `main':
https.c.text+0x20): undefined reference to `SSL_library_init'
https.c.text+0x25): undefined reference to `OPENSSL_add_all_algorithms_noconf'
https.c.text+0x2a): undefined reference to `SSL_load_error_strings'
https.c.text+0x2f): undefined reference to `SSLv23_client_method'
https.c.text+0x3f): undefined reference to `SSL_CTX_new'
https.c.text+0xf5): undefined reference to `SSL_new'
https.c.text+0x10a): undefined reference to `SSL_set_fd'
https.c.text+0x116): undefined reference to `SSL_connect'
https.c.text+0x190): undefined reference to `SSL_write'
https.c.text+0x1d5): undefined reference to `SSL_read'
https.c.text+0x1f8): undefined reference to `SSL_free'
https.c.text+0x20e): undefined reference to `SSL_CTX_free'

Добавлено через 14 часов 8 минут
Eсли я подключу или перемещу в нужные папки все необходимые файлы *.h и *.a поставляемые openssl, то проект будет компилироваться не зависимо от того какая у меня стоит OS? Или мне нужно пройти процедуру установки openssl и наличие файлов *.h и *.a, в нужном месте, недостаточно для компиляции?
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
31.12.2015, 12:14 15
Цитата Сообщение от freeollo Посмотреть сообщение
Eсли я подключу или перемещу в нужные папки все необходимые файлы *.h и *.a поставляемые openssl, то проект будет компилироваться не зависимо от того какая у меня стоит OS? Или мне нужно пройти процедуру установки openssl и наличие файлов *.h и *.a, в нужном месте, недостаточно для компиляции?
Давайте по порядку.
1. Для сборки вашей программы нужна библиотека libopenssl вместе с заголочными файлами (или, как вариант две библиотеки libssl и libcrypto).
2. Стандартный способ установки библиотек - менеджер пакетов (apt-get, yum ....). Версии библиотек для разработчиков также включают заголовочные файлы и статические либы. Они обычто имеют суффикс -dev в Дебиане и -devel в РедХэте. Напр. у меня в Дебиане достаточно установить libssl-dev.
3. При таким образом установленной библиотеке для ее подключения компилятору достаточно дать опции, которые выводит команда pkg-config --cflags --libs openssl.
4. По умолчанию сборка динамическая - т.е. статические библиотеки (с расширением *.a) вовсе не нужны. Используются динамические (*.so).
5. Если вы где-то скачали библиотеку и не через пакет, и не в виде исходников, а в виде набора заголовочных файлов и статических библиотек, то, во-первых нужно проверить соответствие версий этих библиотек вашей архитектуре, потом проверить и разрешить их зависимости (напр. какую версию libc они требуют), затем указать их в строке компилятора либо через -L -l, либо прямым перечислением *.a файлов наряду с *.c файлами. Но этот путь, ИМХО, самый сложный и самый бестолковый. Обычно либо устанавливают библиотеку пакетом, либо компилируют из исходников.
0
0 / 1 / 0
Регистрация: 14.12.2015
Сообщений: 14
03.01.2016, 12:19  [ТС] 16
Получилось откомпилировать код Скрипт отправляет GET-запрос через https и получает HTML-код запрашиваемый страницы. Большое спасибо gng и sharpey
0
357 / 118 / 20
Регистрация: 08.01.2015
Сообщений: 1,361
Записей в блоге: 1
07.02.2019, 11:37 17
У меня вот так установилась:
Bash
1
2
whereis openssl
openssl: /usr/bin/openssl /usr/include/openssl /usr/local/ssl/bin/openssl /usr/share/man/man1/openssl.1ssl.gz
Компилирую:
Bash
1
gcc  -o https https.c -L. -lssl -lcrypto   -Wl,-I.,-rpath=/usr/local/
В итоге, исполняемый файл создался без ошибок (компилятор их не показал), но при запуске появляется сообщение:
"Permission denied
Обрыв терминальной линии".
Т.е. почему-то не работает.
0
724 / 224 / 72
Регистрация: 01.03.2011
Сообщений: 629
09.02.2019, 11:54 18
Цитата Сообщение от Htext Посмотреть сообщение
У меня вот так установилась:
Складывается впечатление, что вы библиотеку руками ставили, что-то поломав при этом.
Выхлоп ldd для этой программы и любой системной использующей openssl (например /usr/bin/wget) для libcrypo и libssl отличается?
0
357 / 118 / 20
Регистрация: 08.01.2015
Сообщений: 1,361
Записей в блоге: 1
09.02.2019, 14:51 19
Да, руками, в итоге. Т.к. она, похоже, была изначально установлена (при предыдущей установке Ubuntu) неправильно. Или поломалась в процессе, как говорится. Поэтому нарушения связей не устранялись и при компиляции ошибки были. И в конце концов, видимо, я ее доломал окончательно.
Переустановил Ubuntu, вместо apt-get использовал aptitude - проблема решилась, все скомпилировалось.
Да, и вместо -rpath=usr/local/ использую теперь -L/usr/lib.

Bash
1
2
3
4
5
6
7
8
9
10
11
12
$ ldd /usr/bin/wget
    linux-vdso.so.1 =>  (0x00007ffce9d3b000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007fc8653eb000)
    libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007fc8651e6000)
    libssl.so.1.0.0 => /lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007fc864f7d000)
    libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007fc864b38000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fc86491e000)
    libidn.so.11 => /usr/lib/x86_64-linux-gnu/libidn.so.11 (0x00007fc8646eb000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc864321000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc864104000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fc8658d5000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fc863f00000)

Не по теме:

Правда, именно Яндекс выдает ошибку 406, не желает контент отдавать. По всей видимости (я еще не проверял), ему требуется полный набор заголовков, а в стр.38 только 1 заголовок присутствует. А вот, скажем, Google вполне отдает контент главной страницы.


А вот интересно, если сделать этим кодом запрос на какой-нибудь зараженный вирусами сайт - по идее, код вируса ведь должен прийти на ТСР-соединение вместе с html-кодом?
0
724 / 224 / 72
Регистрация: 01.03.2011
Сообщений: 629
09.02.2019, 15:23 20
Цитата Сообщение от Htext Посмотреть сообщение
Правда, именно Яндекс выдает ошибку 406, не желает контент отдавать. По всей видимости (я еще не проверял), ему требуется полный набор заголовков,
Попробуйте поменять url на / и добавить Host: еще возможно оно хочет HTTP/1.1 тогда не помешает Connection: close
Цитата Сообщение от Htext Посмотреть сообщение
вместе с html-кодом?
Да. Но скорее с каким-нибудь скриптом или картинкой.
1
09.02.2019, 15:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.02.2019, 15:23
Помогаю со студенческими работами здесь

Отправка запроса на сервер, и получение ответа
Нужно сделать запрос на сайт, &quot;http://....... .php и что бы он в ответ выдал Фамилию и пароль....

Отправка POST запроса и получение ответа
Есть проблема. Нужно отправить на сайт POST запрос и в зависимости от этого запроса сайт выдает...

Отправка Post запроса на сайт и получение ответа
Здравствуйте. Помогите решить такую проблему: есть сайт на котором всего одно поле для ввода. в...

Отправка запроса на сервер - получение ответа в xml и обработка
Всем добрый день. Искал по всем форумам и всем блогам, но нужного ответа не нашел и не добился...


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

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