Как заставить OpenSSL использовать http вместо https? - PullRequest
2 голосов
/ 09 января 2011

Итак, я хочу просто: я люблю openSSL API. Я нашел простой код для начала для его изучения. Я совершенно новичок в создании серверов. Интересно - как заставить OpenSSL работать с простым http вместо https? Я имею в виду, что хочу предоставлять ту же услугу, быть способным подключаться к https, когда мне это нужно, но не иметь никакой защиты http.

Я имею в виду, что так приятно просто сказать

 SSLServer server("cert", "pkey", 1420);

  // Set the thread function.
  server.SetPthread_F(conn_thread);

Хотелось бы сделать то же самое для создания незащищенной службы http.

После некоторых решительных ответов, которые я понял, я отредактирую основной вопрос:

Как сохранить / использовать только неблокирующую часть TCP-сервера библиотеки OpenSSL? Основной целью было бы создание кроссплатформенного небольшого и простого в использовании TCP-сервера, поверх которого было бы легко реализовать исчисленные аналоги http и http

Итак, если мы посмотрим на пример:

#include <openssl/ssl.h>
#include <openssl/err.h>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include "sslserver.h"

#define REPLY "<html><body>Metalshell.com OpenSSL Server</body></html>"
#define MAX_PACKET_SIZE 1024

// Called when a new connection is made.
void *conn_thread(void *ssl) {
  int fd = SSL_get_fd((SSL *)ssl);

  if(SSL_accept((SSL *)ssl) == -1) {
    ERR_print_errors_fp(stderr);
  } else {
    char cipdesc[128];
    SSL_CIPHER *sslciph = SSL_get_current_cipher((SSL *)ssl);

    cout << "Encryption Description:\n";
    cout << SSL_CIPHER_description(sslciph, cipdesc, sizeof(cipdesc)) << endl;

    char buff[MAX_PACKET_SIZE];
    // Wait for data to be sent.
    int bytes = SSL_read((SSL *)ssl, buff, sizeof(buff));
    buff[bytes] = '\0';

    // Show the browser request.
    cout << "Recieved: \n" << buff << endl;

    // Send the html reply.
    SSL_write((SSL *)ssl, REPLY, strlen(REPLY));
  }

  // Tell the client we are closing the connection.
  SSL_shutdown((SSL *)ssl);

  // We do not wait for a reply, just clear everything.
  SSL_free((SSL *)ssl);
  close(fd);

  cout << "Connection Closed\n";
  cout << "---------------------------------------------\n";

  pthread_exit(NULL);
}

int main() {
  SSLServer server("cert", "pkey", 1420);

  // Set the thread function.
  server.SetPthread_F(conn_thread);

  while(1) {
    /* Wait for 10 seconds, and if no one trys
     * to connect return back.  This allows us to do
     * other things while waiting.
     */
    server.CheckClients(10);
  }

  return 0;
}

Что нужно изменить, чтобы наш сервер принимал все соединения, а не только ssl (cout, если это возможно, полный запрос) и отправлял им ОТВЕТЫ?

Ответы [ 4 ]

11 голосов
/ 09 января 2011

HTTPS - это простой HTTP с SSL (реализация которого является точкой OpenSSL).S в HTTPS означает безопасный.

Не используйте API OpenSSL, когда вы не хотите SSL.

2 голосов
/ 09 января 2011

Если вы посмотрите на Книгу OpenSSL в главе 5 (я думаю), они строят простой SSL-сервер за несколько шагов.На первом этапе используется API-интерфейс OpenSSL для ввода-вывода по сети в незашифрованном виде (не-SSL), что и требуется.

1 голос
/ 09 января 2011

Код, на который вы ссылаетесь, является тривиальной реализацией неблокирующего TCP-сервера + SSL. Поэтому вам нужно убрать OpenSSL из этого кода, и у вас есть тривиальная реализация неблокирующего TCP-сервера. Обратите внимание, что это очень далеко от реального HTTP-сервера - он вообще не выполняет синтаксический анализ запроса (который может быть нетривиальным) и отвечает предопределенным ответом. Поэтому, если вам нужен HTTP / HTTPS сервер , вам нужно найти соответствующую стороннюю библиотеку или код.

0 голосов
/ 05 мая 2012

HTTPS будет работать только тогда, когда и клиентские, и серверные приложения будут «ЗНАЕТ», что транзакция произойдет в SSL.Поэтому большинство приложений имеют независимые точки входа для связи ssl и non-ssl, например, HTTP обычно находится на порту 80, а HTTPS - на порту 443. Если клиент начинает транзакцию на порту 80, и если приложение на стороне сервера определяет этот остатокобмена должен быть защищен, он «перенаправляет» клиентское приложение для транзакций через порт 443. Например, если вы обращаетесь к http://www.gmail.com, транзакция начинается с обмена данными через порт 80, однако, поскольку это приложение требует безопасного входа в систему,он перенаправляет ваш браузер, чтобы открыть новое соединение с другим URL-адресом на порту 443.

Вы тоже можете сделать то же самое, и да, пока транзакции происходят в SSL, вы можете указать клиенту начать транзакцию через незащищенный порт.порт 80 тоже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...