2016-09-10 3 views
3

Я только что скомпилировал и установил OpenSSL для 64-разрядной Windows. Я создал самозаверяющий сертификат и закрытый ключ с помощью команды:OpenSSL для 64-битной Windows и «без общего шифрования»

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 10000 -nodes 

Я сейчас тестирую "Simple TLS Server" example найти в OpenSSL Wiki с Firefox и несколько модификаций для поддержки Winsock, но я получаю ошибку

11216:error:1417A0C1:SSL routines:tls_post_process_client_hello:no shared cipher:ssl\statem\statem_srvr.c:1422: 

(первое число всегда меняется) во время выполнения функции SSL_accept(). Я проверил список (11) шифров, отправленных Firefox (v 43.0.1) в своем TLS v1.2 Client Hello при подключении к некоторому серверу HTTPS с использованием Wireshark (потому что захват на локальном хосте затруднен) и сравнил его с поддерживаемыми по моей установке OpenSSL (найдена с использованием openssl.exe ciphers -s -tls1_2 -V). В результате являются распространенными шифрами, так что я не хватает ?!

блок, содержащий линию 1422 statem_srvr.c заключается в следующем, начиная с 1420:

if (cipher == NULL) { 
    SSLerr(SSL_F_TLS_POST_PROCESS_CLIENT_HELLO, 
      SSL_R_NO_SHARED_CIPHER); 
    goto f_err; 
} 

Модификации исходного кода являются, прежде чем время цикла и в заголовках:

#pragma comment(lib,"Ws2_32.lib") 
#include <stdio.h> 
#include <winerror.h> 
#include <WinSock2.h> 
#include <openssl/ssl.h> 
#include <openssl/err.h> 
#include <openssl/applink.c> 

и

int sock; 
SSL_CTX *ctx; 

WSADATA WsaDat; 
if (WSAStartup(MAKEWORD(2, 2), &WsaDat) != 0) perror("Winsock fatal startup error"); 
init_openssl(); 
ctx = create_context(); 
configure_context(ctx); 

sock = create_socket(4433); 

Edit: Это то, что происходит, когда я пытаюсь подключиться к серверу, используя s_client с TLSv1.2:

CONNECTED(000000F0) 
23368:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:ssl\record\rec_layer_s3.c:1362:SSL alert number 40 
--- 
no peer certificate available 
--- 
No client certificate CA names sent 
--- 
SSL handshake has read 7 bytes and written 176 bytes 
Verification: OK 
--- 
New, (NONE), Cipher is (NONE) 
Secure Renegotiation IS NOT supported 
Compression: NONE 
Expansion: NONE 
No ALPN negotiated 
SSL-Session: 
    Protocol : TLSv1.2 
    Cipher : 0000 
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: 
    PSK identity: None 
    PSK identity hint: None 
    SRP username: None 
    Start Time: 1473536238 
    Timeout : 7200 (sec) 
    Verify return code: 0 (ok) 
    Extended master secret: no 
--- 
+0

Можете ли вы подключиться к локальному серверу с помощью самого openssl? С каким шифрованием он связан? 'openssl s_client -connect localhost: 4433 -tls1_2' –

+0

Нет, я получаю ту же ошибку. Я опубликую выходные данные клиентской программы. –

+0

@JasonHoetger - Он на машине с Windows. Возможно, ему потребуется использовать TLS 1.0 вместо 1.2 (SChannel не имеет TLS 1.2 в версиях Windows). @ Æðelstan - попробуйте 'openssl s_client -connect localhost: 4433 -tls1 -servername localhost'. '-servername' завершает SNI, что является функцией TLS 1.0 и выше. Также может возникнуть проблема с 4096-битным ключом. Многие версии Windows могут обрабатывать только 2048-битные ключи. – jww

ответ

0

Как выясняется, возникла проблема с поиском сертификата и секретного ключа. Задача решена.

0

Комментарий EJP решил мою проблему. В моем случае я создал объект SSL с SSL_CTX, но установил сертификат и ключ для SSL_CTX после. Я создал объект ssl, поэтому сертификат и ключ никогда не копировались в объект SSL. Перемещение моего сертификата и кода на до Я создал свой объект SSL, решив проблему.

Неправильный путь:

/*Create SSL Context*/ 
SSL_CTX *ctx = SSL_CTX_new(TLS_server_method()); 

/*Create SSL Object*/ 
SSL *ssl = SSL_new(ctx); 

/*Load certs into SSL server*/ //<---WRONG; SHOULD NOT BE HERE 
if (!SSL_CTX_use_certificate_file(ctx, "C:\\Users\\dzmf39\\Documents\\PPH1261726\\TLS\\tls_cert.pem", SSL_FILETYPE_PEM)) { 
    fprintf(stderr, "Error while loading SSL Server Certificate.\n"); 
    return 0; 
} 

if (!SSL_CTX_use_PrivateKey_file(ctx, "C:\\Users\\dzmf39\\Documents\\PPH1261726\\TLS\\tls_key.pem", SSL_FILETYPE_PEM)) { 
    ERR_print_errors_fp(stderr); 
    return 0; 
} 

SSL_do_handshake(ssl); //Throws handshake error 

Right Way

/*Create SSL Context*/ 
SSL_CTX *ctx = SSL_CTX_new(TLS_server_method()); 

/*Load certs into SSL server*/ //<---CORRECT; GOES BEFORE SSL object creation 
if (!SSL_CTX_use_certificate_file(ctx, "C:\\Users\\dzmf39\\Documents\\PPH1261726\\TLS\\tls_cert.pem", SSL_FILETYPE_PEM)) { 
    fprintf(stderr, "Error while loading SSL Server Certificate.\n"); 
    return 0; 
} 

if (!SSL_CTX_use_PrivateKey_file(ctx, "C:\\Users\\dzmf39\\Documents\\PPH1261726\\TLS\\tls_key.pem", SSL_FILETYPE_PEM)) { 
    ERR_print_errors_fp(stderr); 
    return 0; 
} 

/*Create SSL Object*/ 
SSL *ssl = SSL_new(ctx); 

SSL_do_handshake(ssl); 

Существуют и другие методы, где вы можете добавить ключ непосредственно к объекту SSL, в этом случае это не будет применяться, но я не пошел по этому маршруту.