2011-01-09 16 views
2

私が望むものは単純です - 私はopenSSL APIが大好きです。私はそれを学ぶためにいくつかsimple code to begin withを見つけました。私はサーバーの作成には全く新しいものです。私は不思議です - どのようにOpenSSLをhttpsではなく単純なhttpで動作させるのですか?私は同じサービスを提供したいと思っていますが、必要なときにはhttpsにジャンプすることができますが、そのHTTPの保護はありません。OpenSSLでhttpsの代わりにhttpを使用するにはどうすればいいですか?

私はそれは私が、私は保護されていないHTTPサービスの作成のために同じことを行うことがしたいだけ

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

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

を言ってすりおろであることを意味します。

OpenSSLライブラリの唯一のノン・ブロッキングTCPサーバーの一部を使用/維持する方法:私は、メインの質問に編集しなければなら理解いくつかの火格子の答えの後

?主な目標は、HTTPとHTTP costumizedを実装するためにイージーになるの上に使用するTCPサーバーで小型でシンプルなクロスプラットフォームとなり、我々は一例に見ればそう

を類似体:

変更されなければならない何
#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もの(可能な場合は完全な要求)を返信して返信しますか?

+0

これはServerFaultの質問のようです。 – robert

答えて

11

HTTPS です(実装はOpenSSLのポイントです)。 HTTPSのSはセキュアを表します。

SSLを必要としないときにOpenSSL APIを使用しないでください。

+0

一般的にopenSSLについて私が愛していたのはサービス作成APIです - 単純なhttpサービスのための類似のlibや、必要に応じてopensslでnanへの保護を設定する方法はありますか? – Rella

1

参照したコードは、非ブロッキングTCPサーバー+ SSLの簡単な実装です。だから、あなたがしなければならないのは、そのコードからOpenSSLを取り除くことです。そして、あなたは非ブロッキングTCPサーバーの簡単な実装を持っています。これは実際のHTTPサーバとはかなり離れていることに注意してください。リクエスト解析はまったく実行されません(単純ではありません)。あらかじめ定義された応答で応答します。したがって、HTTP/HTTPS サーバが必要な場合は、対応するサードパーティライブラリまたはコードを検索する必要があります。

+0

クロスプラットフォームのtcpソケットラッパーの上にシンプルなTCPサーバーを置くだけで十分ですが、そのサンプルコードからTCPサーバーの機能を取り除く方法について質問があります。 – Rella

+0

@Kabumbusは "シンプルなhttpサーバーC++コード"のgoogle検索を行っていますが、あなたが使ったサンプルからopensslを取り除く手間を省くことができます。 –

+0

ここでポイントはhttps world =への将来の急速な飛躍の可能性のためのopensslを行うことです。 – Rella

2

第5章のOpenSSL Bookを見ると、一連の手順で単純なSSLサーバーが構築されています。最初のステップでは、OpenSSL APIを使用して、要求しているプレーンテキスト(非SSL)ネットワークI/Oを実行します。

0

HTTPSは、クライアント側とサーバー側の両方のアプリケーションがトランザクションの「AWARE」をSSLで実行する場合にのみ機能します。したがって、ほとんどのアプリケーションでは、sslおよびnon-ssl通信には独立したエントリポイントがあります。たとえばHTTPは通常ポート80に、HTTPSはポート443になります。クライアントがポート80でトランザクションを開始し、例えば、http://www.gmail.comにアクセスすると、ポート80での通信からトランザクションが開始されますが、このアプリケーションは安全にログインする必要があるため、ブラウザをリダイレクトして、ポート803からポート443にリダイレクトします。ポート443の別のURLへの新しい接続を開きます。

SSLでトランザクションが起きている間も同じことを行うことができます。クライアントがポートのセキュリティで保護されていないポート80でもトランザクションを開始するように指示できます。

関連する問題