2016-09-10 77 views
3

我刚编译并安装了64位Windows的OpenSSL。我创建了一个自签名的证书,可以在命令私钥:适用于64位Windows和“无共享密码”的OpenSSL

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

我现在测试"Simple TLS Server" example在OpenSSL的维基与Firefox和一对夫妇的修改,以支持的Winsock的发现,但我不断收到错误

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

(第一个数字总是变化)在执行SSL_accept()函数期间。我在使用Wireshark连接到某些HTTPS服务器(因为在本地主机上捕获很困难)时,检查了Firefox(v 43.0.1)发送的(11)密码在其TLS v1.2 Client Hello中的列表,并将其与支持的通过我安装的OpenSSL(使用openssl.exe ciphers -s -tls1_2 -V找到)。结果是有常见的密码,所以我错过了什么?!

含有statem_srvr.c的线1422的块是以下,从1420:

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

到原始代码的修改都在while循环前和在标头:

#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); 

编辑:这是当我尝试连接到使用的s_client.First与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在Windows的可能版本中缺少TLS 1.2)。 @Æðelstan - 尝试'openssl s_client -connect localhost:4433 -tls1 -servername localhost'。 '-servername'登记SNI,这是一个TLS 1.0及以上的功能。 4096位密钥也可能是一个问题。许多版本的Windows只能处理2048位密钥。 – jww

回答

0

事实证明,不存在与发现的证书和私钥的问题。问题解决了。

0

EJP的评论解决了我的问题。在我的情况下,我使用SSL_CTX创建了一个SSL对象,但在之后为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 

正确的方式

/*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对象,在这种情况下,这将不适用,但我没有走这条路。

相关问题