2016-09-19 3 views
1

Я пишу SSL-сервер и клиент для связи. У меня есть следующий код для сервераНет сертификатов сервера и «нет общего шифрования» при подключении клиентов

SSL_CTX* InitServerCTX(void) 
{  
    SSL_METHOD *method; 
    SSL_CTX *ctx; 
    SSL_library_init(); 
    OpenSSL_add_all_algorithms();  /* load & register all cryptos, etc. */ 
    SSL_load_error_strings(); 

    ERR_load_crypto_strings(); 
    OpenSSL_add_all_ciphers(); 

    ctx = SSL_CTX_new(SSLv23_server_method());   /* Create new context */ 
    if (ctx == NULL) 
    { 
     ERR_print_errors_fp(stderr); 
     abort(); 
    } 

    SSL_CTX_set_cipher_list(ctx, "HIGH:MEDIUM:!eNULL:!aNULL:!RC4"); 

    return ctx; } 

После этого код принять это

int client = accept(server, (sockaddr*)&addr, &len);  /* accept connection as usual */ 
printf("Connection: %s:%d\n", 
inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); 
ssl = SSL_new(ctx);       /* get new SSL state with context */ 
SSL_set_fd(ssl, client); 
int ret = SSL_accept(ssl); 

А вот код клиента

SSL_CTX* InitCTX(void) 
{ 
    SSL_METHOD *method; 
    SSL_CTX *ctx; 
    SSL_library_init(); 
    OpenSSL_add_all_algorithms();  /* Load cryptos, et.al. */ 
    SSL_load_error_strings();   /* Bring in and register error messages */ 
    ctx = SSL_CTX_new(SSLv23_client_method());   /* Create new context */ 
    if (ctx == NULL) 
    { 
     ERR_print_errors_fp(stderr); 
     abort(); 
    } 

    SSL_CTX_set_cipher_list(ctx, "HIGH:MEDIUM:!eNULL:!aNULL:!RC4"); 
    return ctx; 
} 

Для подключения это

ssl = SSL_new(ctx);      /* create new SSL connection state */ 
SSL_set_fd(ssl, server);    /* attach the socket descriptor */ 
int ret = SSL_connect(ssl) ; 

Я не использую сертификаты или ключи.

Когда я пытаюсь соединиться с использованием этого подхода, я не получаю ошибку общих шифров на стороне сервера. Я думаю, что это проблема конфигурации в отношении шифров. Может кто-то, пожалуйста, укажите мне правильное направление.

Благодаря

+0

Как правило, в этом *** варианте использования (без сервера auth) вы используете Анонимный Диффи-Хеллман (ADH) или EC Anonymous Diffie-Hellman (ECADH). Вы должны удалить *** '! ANULL' *** из списка наборов шифров на * и * клиенте и сервере. Некоторые пользовательские агенты, такие как браузеры, не принимают его. Связанная тема - [оппортунистическое шифрование] (http://en.wikipedia.org/wiki/opportunistic_encryption). Он используется в случаях использования, таких как MTA и почтовые серверы, и *** может быть *** применим в вашем случае использования. – jww

ответ

4
SSL_CTX_set_cipher_list(ctx, "HIGH:MEDIUM:!eNULL:!aNULL:!RC4"); 

Я не использую никаких сертификатов или ключей.

Поскольку вы не используете сертификаты или SRP, единственными возможными шифрами являются, таким образом, когда аутентификация сервера не выполняется. Но вы явно запретили эти шифры с !aNULL как на клиенте, так и на сервере. Это означает, что ни один из шифров, предлагаемых клиентом или не принятый сервером, не может работать без аутентификации, что приводит к «отсутствию общих шифров». Из документации ciphers:

aNULL
в шифров не предлагают никакой аутентификации. В настоящее время это анонимные алгоритмы DH . Эти шифрованные сюиты уязвимы для «человека в средней» атаки, поэтому их использование обычно не рекомендуется.

+0

Чтобы развернуть это, openssl не вызывает ошибок во множестве плохих конфигураций. Вы получите «нет общих шифров», если ваши сертификаты/шифр-список/специфичные для шифрования конфигурации не совпадают. Если вы просто выполните небольшое тестирование, следуйте https://stackoverflow.com/questions/10175812/how-to-create-a-self-signed-certificate-with-openssl, чтобы сделать некоторые сертификаты, затем передайте их в файл SSL_CTX_use_certificate_chain_file ',' SSL_CTX_use_PrivateKey_file' и 'SSL_CTX_load_verify_locations' –

+0

, так что, если я разрешаю все шифры и не укажу вышеприведенную строку ... это позволит мне подключиться? – kunal

+0

@kunal: если вы разрешаете все шифры или просто aNULL как на клиенте, так и на сервере, это, вероятно, будет работать или, по крайней мере, не приведет к этой ошибке (не более подробно рассмотрим остальную часть кода). Но будьте осторожны, что это очень неуверенно, т. Е. Человек в средней атаке легко, если вы не добавите какую-то надлежащую аутентификацию сервера. –