2011-01-09 4 views
2

Так что я хочу просто -Я люблю openSSL api. Я нашел simple code to begin with для изучения этого. Я совершенно новичок в создании сервера. Интересно, как заставить OpenSSL работать с простым http вместо https? Я имею в виду, что я хочу предоставить тот же сервис, быть в состоянии прыгать в https, когда мне нужно, но не имеет защиты от http.Как заставить OpenSSL использовать http вместо https?

Я имею в виду это так тереть просто сказать

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

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

Я хотел бы сделать то же самое для не защищенного создания службы HTTP.

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

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

Таким образом, если мы посмотрим на пример:

#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 полный запрос, если это возможно) и отправить их REPLY?

+0

Это звучит как вопрос для ServerFault. – robert

ответ

11

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

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

+0

Как правило, то, что я любил в openSSL, - это создание сервисов. Api. Есть ли подобные lib для простых http-сервисов или любой способ установить защиту nan с помощью openssl, когда это необходимо? – Rella

1

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

+0

Было бы более чем достаточно для того, чтобы у меня был простой TCP-сервер поверх кроссплатформенной оболочки tcp socket, поэтому вопрос заключается в том, как отключить функциональность сервера TCP из этого образца кода. – Rella

+0

@Kabumbus, выполняющий поиск в Google для «простого HTTP-кода C++», показывает пару [повторно] используемых серверов, которые предоставят вам то, что вам нужно, без хлопот с раскрытием openssl из образца, который вы использовали. –

+0

точка здесь, чтобы сделать это wit openssl для capabilety будущего быстрого перехода в https world =) – Rella

2

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

0

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

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

Смежные вопросы