2016-07-17 11 views
0

C++でOpensslを使用して安全な接続を作成するためにsslサーバーを開発します。しかし、別のプロトコルパケットにカプセル化されたClient Helloメッセージを受信します。サンプルパケット:カプセル化されたパケットにopensslを使用する

Simple TCP Packet = TCP Headers | TCP Data 
TCP Data   = Protocol Headers | Protocol Data | Client Hello 

クライアントのHelloをパケットから抽出するにはどうすればよいのですか?また、Opensslでどのように使用できますか?

マイコード:

#include <cstdlib> 
#include <iostream> 

#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 

#include <openssl/rand.h> 
#include <openssl/ssl.h> 
#include <openssl/err.h> 
#include <unistd.h> 

using namespace std; 

int main() { 
    /* 
    ------------------ START Initialize Server ------------------ 
    */ 

    int serverfd, clientfd; 
    struct sockaddr_in vir_serv_addr, cli_addr; 

    serverfd = socket(AF_INET, SOCK_STREAM, 0); 
    bzero((char *) &vir_serv_addr, sizeof (vir_serv_addr)); 

    vir_serv_addr.sin_family = AF_INET; 
    vir_serv_addr.sin_addr.s_addr = INADDR_ANY; 
    vir_serv_addr.sin_port = htons(9999); 

    bind(serverfd, (struct sockaddr *) &vir_serv_addr, sizeof (vir_serv_addr)); 
    listen(serverfd, 5); 
    socklen_t client = sizeof (cli_addr); 
    clientfd = accept(serverfd, (struct sockaddr*) &cli_addr, (socklen_t*) & client); 

    /* 
    ------------------- END Initialize Server ------------------- 
    */ 

    /* 
    ------------------ START SSL ------------------ 
    */ 

    SSL_library_init(); 
    SSL_load_error_strings(); 
    OpenSSL_add_all_algorithms(); 

    FILE* certF = fopen("server-cert.pem", "r"); 
    X509* cert = PEM_read_X509(certF, NULL, NULL, NULL); 

    FILE* keyF = fopen("server-key.pem", "r"); 
    EVP_PKEY* key = PEM_read_PrivateKey(keyF, NULL, NULL, NULL); 

    SSL_CTX* context = SSL_CTX_new(TLSv1_server_method()); 

    SSL_CTX_use_certificate(context, cert); 
    SSL_CTX_use_PrivateKey(context, key); 
    SSL_CTX_check_private_key(context); 

    SSL_CTX_set_ecdh_auto(context, 1); 
    SSL_CTX_set_verify_depth(context, 4); 
    SSL_CTX_load_verify_locations(context, "ca-cert.pem", ""); 

    SSL* ssl = SSL_new(context); 
    SSL_set_fd(ssl, clientfd); 

    int r = SSL_accept(ssl); 
    if (r != 1) { 
     ERR_print_errors_fp(stderr); 
     int err_SSL_get_error = SSL_get_error(ssl, r); 

     switch (err_SSL_get_error) { 
      case SSL_ERROR_NONE: 
       printf("%d", 0); 
       break; 
      case SSL_ERROR_SSL: 
       printf("%d", 1); 
       break; 
      case SSL_ERROR_WANT_READ: 
       printf("%d", 2); 
       break; 
      case SSL_ERROR_WANT_WRITE: 
       printf("%d", 3); 
       break; 
      default: 
       printf("%d", -1); 
       break; 
     } 
    } 

    /* 
    ------------------- END SSL ------------------- 
    */ 

    return 0; 
} 

答えて

1

あなたは、ワイヤ上で直接TLSを話すことはありませんが、代わりにTLSフレームはあなたには、OpenSSL(SSL_set_fd)のファイルディスクリプタのバックエンドを使用することはできませんいくつかの他のプロトコルでカプセル化されている場合。その代わりに、BIOバックエンド(SSL_set_bio)にメモリBIOを使用する必要があります。 BIO OpenSSLは、ファイルディスクリプタからデータを読み書きするのではなく、一部のメモリ位置を読み書きします。詳細については

は、言い換えれば Directly Read/Write Handshake data with Memory BIO

+0

を参照してください、あなたは、カプセル化プロトコルを処理するために、独自のソケットI/Oを行い、その後、読み出し動作中にOpenSSLに暗号化されたTLSデータを渡すためにOpenSSLのBIO APIを使用する必要があります書き込み操作中にOpenSSLから暗号化されたTLSデータを受信します。 –

関連する問題