2016-08-22 669 views
1

此刻我的OpenSSL的版本是OpenSSL:已SSL_CTX_set_ecdh_auto()返回失敗

的OpenSSL 1.0.2h 3 2016

我用的OpenSSL Simple_TLS_Server提供了一個示例代碼來啓動服務器,並使用的s_client.First發送五月握手。像這樣的服務器返回錯誤:

139629255337616:error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher:s3_srvr.c:1349 

而且的s_client.First返回:

CONNECTED(00000003) 
140266915485328:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:769: 
--- 
no peer certificate available 
--- 
No client certificate CA names sent 
--- 
SSL handshake has read 7 bytes and written 307 bytes 
--- 
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: 
    Key-Arg : None 
    PSK identity: None 
    PSK identity hint: None 
    SRP username: None 
    Start Time: 1471879558 
    Timeout : 300 (sec) 
    Verify return code: 0 (ok) 
--- 

閱讀本Manual:SSL_CTX_set1_curves(3)後,我修改了原來的一些行:

if(!SSL_CTX_set_ecdh_auto(ctx, 1)) 
{ 
    fprintf(stderr, "Error: SSL_CTX_set_ecdh_auto(ctx, 1)\n"); 
} 

當我重新啓動Simple_TLS_Server,它打印

Error: SSL_CTX_set_ecdh_auto(ctx, 1) 

也試過這樣:

if(!SSL_CTX_set_ecdh_auto(ctx, 1)) 
{ 
    ERR_print_errors_fp(stderr); 
} 

但沒有可用的錯誤消息。 有誰知道這是怎麼發生的?如果您需要更多信息,請讓我知道。

PS:我嘗試證書和密鑰與s_server和s_client,工作正常。

+0

*「...我的openssl版本是OpenSSL 1.0.2h 2016年5月3日」* - 您確定嗎?對你的服務器運行'ldd',看看哪個版本的OpenSSL是運行時鏈接/加載。如果它*不是*你認爲的那個,那麼(1)用'-Wl,-rpath =/usr/local/ssl/lib'構建你的服務器;或者(2)用'LD_LIBRARY_PATH =/usr/local/ssl/lib'啓動你的服務器。 – jww

+0

@jww,非常感謝。我將服務器鏈接到舊版本的OpenSSL庫。現在我用'gcc -o test test.c -L/usr/local/ssl/lib/-I/usr/local/ssl/include -lssl -lcrypto -ldl'來重建服務器。服務器現在工作正常。 – eloy

回答

0

有誰知道這怎麼會發生?

根據源代碼中的唯一的情況下,返回SSL_CTX_set_ecdh_auto 0是當OpenSSL庫未經支持編譯爲ECDH(OPENSSL_NO_ECDH)或不用在所有(OPENSSL_NO_EC)橢圓曲線的支持。

+0

當我執行./config時,我使用了OpenSSL的默認配置。我的問題就像上面描述的那樣。謝謝。 – eloy