2017-04-16 110 views
2

我在使用SNI的單個服務器上運行100個HTTPS服務。 (實際上,我沒有權限訪問它,這是一個任務,我所知道的是他們的域名N.xxx.yy,其中N的範圍是從00到99.)該任務的目標是評估每個連接的安全性這些服務器。因此,一些服務器包含過期的證書,錯誤的CN證書等。OpenSSL連接:警告內部錯誤

我的問題是我無法通過一些服務器的握手。我用C++編寫了自己的應用程序,使用OpenSSL,但我也用openssl s_client嘗試過。這就是我如何連接到服務器:

openssl s_client -host N.xxx.yy -port 443 -verify 1 -servername N.xxx.yy -CAfile assignment-ca.pem 

而這就是我得到:

139625941858168:error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error:s3_pkt.c:1493:SSL alert number 80 
139625941858168:error:140790E5:SSL routines:ssl23_write:ssl handshake failure:s23_lib.c:177: 

在Wireshark的,我看到客戶端發送ClientHello,服務器迴應ServerHello(選擇TLSv1.2工作和ECDHE-RSA-AES256-GCM-SHA384),然後是Certificate,然後發給我Alert包含Internal Error (80)的消息。

嘗試不同的事情後,我發現如果我運行s_client-tls1-tls1_1我可以成功通過握手。 -tls1_2不起作用。更奇怪的是,即使協商TLSv1.2,通過Chrome/Firefox /任何其他瀏覽器的連接也能成功。從我所看到的,Chrome發送的密碼列表與我或s_client不同,但即使在修改密碼列表以匹配Chrome中的密碼列表(並確保服務器選擇ECDHE-RSA-AES128-GCM-SHA256)後,它也不起作用。 Chrome正在發送這些TLS擴展名,我並不認爲它們大部分都是空的:

Unknown 47802 
renegotiation_info 
Extended Master Secret 
signed_certificate_timestamp 
status_request 
Application Layer Protocol Negotiation 
channel_id 
Unknown 6682 

有人能解釋我這裏發生了什麼嗎?不幸的是,我無法在服務器端進行調試,所以這就是我所知道的。

UPDATE:

玩弄我設法追查到signature_algorithms擴展僞造ClientHello的消息後。我的應用程序和s_client提供SHA384 + {RSA,DSA,ECDSA},但如果我刪除這些並僅保留SHA256 + {RSA,DSA,ECDSA},就像Chrome一樣,它可以正常工作,並且我會成功收到Server Key Exchange消息。難道這是服務器莫名其妙地不支持它,而不是提供有意義的錯誤消息,它只是意外結束,並給我這個內部錯誤?

更新2:

我找到答案,爲什麼它之前可與TLS版本1.2在RFC5246。以前的UPDATE問題仍然存在。

Note: this extension is not meaningful for TLS versions prior to 1.2. 
    Clients MUST NOT offer it if they are offering prior versions. 
    However, even if clients do offer it, the rules specified in [TLSEXT] 
    require servers to ignore extensions they do not understand. 
+0

你能分享代碼嗎?我面臨類似的問題,我想在一個單獨的程序中重現它。你的代碼可能會有所幫助。 –

回答

0

既然你寫了-tls1_2 does not work我認爲您和/或服務器使用舊的OpenSSL庫。寫這篇文章的當前版本是1.1.0e

從0.9.8開始有相當多的修復,這在以前的系統上經常可以看到。

對於Version 1.0.1有此修復程序,這聽起來像你的問題:

`Some servers which support TLS 1.0 can choke if we initially indicate 
support for TLS 1.2 and later renegotiate using TLS 1.0 in the RSA 
encrypted premaster secret. As a workaround use the maximum permitted 
client version in client hello, this should keep such servers happy 
and still work with previous versions of OpenSSL.` 

也許還notable

Don't allow TLS 1.2 SHA-256 ciphersuites in TLS 1.0, 1.1 connections.

所以我建議更新您的OpenSSL版本,並在情況的服務器超出你的控制範圍我會堅持你已經找到的設置。