Форум программистов, компьютерный форум, киберфорум
Наши страницы
С под Linux
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
freeollo
0 / 0 / 0
Регистрация: 14.12.2015
Сообщений: 10
#1

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

26.12.2015, 12:00. Просмотров 1194. Ответов 15
Метки нет (Все метки)

Использую сокеты для отправки 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.12.2015, 12:00
Ответы с готовыми решениями:

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

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

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

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

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

15
gng
807 / 552 / 167
Регистрация: 08.09.2013
Сообщений: 1,495
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
freeollo
0 / 0 / 0
Регистрация: 14.12.2015
Сообщений: 10
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
gng
807 / 552 / 167
Регистрация: 08.09.2013
Сообщений: 1,495
29.12.2015, 11:24 #4
freeollo, Линкер не находит библиотеку. Если openssl установлена стандартным способом
Bash
1
gcc `pkg-config --cflags --libs openssl` -o https https.c
0
freeollo
0 / 0 / 0
Регистрация: 14.12.2015
Сообщений: 10
29.12.2015, 16:47  [ТС] #5
а как можно поставит нестандартным способом? Переместить папку openssl в user/include? Можно поставить openssl на Mас os. На сервере не совсем удобно писать скрипты
0
sharpey
339 / 134 / 32
Регистрация: 21.09.2008
Сообщений: 445
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
freeollo
0 / 0 / 0
Регистрация: 14.12.2015
Сообщений: 10
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
sharpey
339 / 134 / 32
Регистрация: 21.09.2008
Сообщений: 445
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
freeollo
0 / 0 / 0
Регистрация: 14.12.2015
Сообщений: 10
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
sharpey
339 / 134 / 32
Регистрация: 21.09.2008
Сообщений: 445
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
freeollo
0 / 0 / 0
Регистрация: 14.12.2015
Сообщений: 10
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
gng
807 / 552 / 167
Регистрация: 08.09.2013
Сообщений: 1,495
30.12.2015, 18:02 #12
Цитата Сообщение от freeollo Посмотреть сообщение
без изменений
Не хочешь pkg-config, так посмотри, перед тем как строку вбивать, где у тебя реально находится библиотека и как называется.
0
sharpey
339 / 134 / 32
Регистрация: 21.09.2008
Сообщений: 445
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
freeollo
0 / 0 / 0
Регистрация: 14.12.2015
Сообщений: 10
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
gng
807 / 552 / 167
Регистрация: 08.09.2013
Сообщений: 1,495
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
freeollo
0 / 0 / 0
Регистрация: 14.12.2015
Сообщений: 10
03.01.2016, 12:19  [ТС] #16
Получилось откомпилировать код Скрипт отправляет GET-запрос через https и получает HTML-код запрашиваемый страницы. Большое спасибо gng и sharpey
0
03.01.2016, 12:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2016, 12:19

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

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru