Я только что скомпилировал и установил 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
---
Можете ли вы подключиться к локальному серверу с помощью самого openssl? С каким шифрованием он связан? 'openssl s_client -connect localhost: 4433 -tls1_2' –
Нет, я получаю ту же ошибку. Я опубликую выходные данные клиентской программы. –
@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