我在使用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.
你能分享代碼嗎?我面臨類似的問題,我想在一個單獨的程序中重現它。你的代碼可能會有所幫助。 –