[英]Jetty "javax.net.ssl.SSLHandshakeException: no cipher suites in common"
[英]"No cipher suites in common” error in Jetty
我已經在Jetty中設置了ssl連接器。 它在運行Windows 7的開發機上可以正常運行,但在Linux開發服務器上無法運行:Chrome / IE / C#客戶端無法打開網頁,並且在Jetty調試日志中顯示“ No cipher suites common”。來自SslConnectionFactory的net.ssl.SSLEngine和支持的Chipher套件的打印列表,對於Windows / Linux機器是相同的(我正在運行相同的Java 1.8.0.11)。 SSL握手?
2016-01-18 10:20:11,875 DEBUG [qtp277169967-36] tty.util.ssl.SslContextFactory - SNI matching for type=host_name (0), value=x.com
2016-01-18 10:20:11,875 DEBUG [qtp277169967-36] tty.util.ssl.SslContextFactory - SNI matched x.com->X509@18479e43(cert0,h=[x.com, y.com, z.com],w=[])
2016-01-18 10:20:11,877 DEBUG [qtp277169967-36] .ssl.SniX509ExtendedKeyManager - Matched x.com with X509@18479e43(cert0,h=[x.com, y.com, z.com],w=[]) from [key]
2016-01-18 10:20:11,877 DEBUG [qtp277169967-36] .ssl.SniX509ExtendedKeyManager - Chose alias null/RSA on 119c684e[SSLEngine[hostname=1.2.3.4 port=64350] SSL_NULL_WITH_NULL_NULL]
2016-01-18 10:20:11,877 DEBUG [qtp277169967-36] .ssl.SniX509ExtendedKeyManager - Matched x.com with X509@18479e43(cert0,h=[x.com, y.com, z.com],w=[]) from [key]
2016-01-18 10:20:11,877 DEBUG [qtp277169967-36] .ssl.SniX509ExtendedKeyManager - Chose alias null/RSA on 119c684e[SSLEngine[hostname=1.2.3.4 port=64350] SSL_NULL_WITH_NULL_NULL]
2016-01-18 10:20:11,877 DEBUG [qtp277169967-36] .ssl.SniX509ExtendedKeyManager - Matched x.com with X509@18479e43(cert0,h=[x.com, y.com, z.com],w=[]) from [key]
2016-01-18 10:20:11,877 DEBUG [qtp277169967-36] .ssl.SniX509ExtendedKeyManager - Chose alias null/RSA on 119c684e[SSLEngine[hostname=1.2.3.4 port=64350] SSL_NULL_WITH_NULL_NULL]
2016-01-18 10:20:11,877 DEBUG [qtp277169967-36] ipse.jetty.io.AbstractEndPoint - onClose SelectChannelEndPoint@5bdd29a4{/10.240.68.111:64350<->8443,CLOSED,in,out,-,-,3/30000,SslConnection}{io=0/0,kio=0,kro=1}
2016-01-18 10:20:11,877 DEBUG [qtp277169967-36] lipse.jetty.io.ChannelEndPoint - close SelectChannelEndPoint@5bdd29a4{/10.240.68.111:64350<->8443,CLOSED,in,out,-,-,3/30000,SslConnection}{io=0/0,kio=0,kro=1}
2016-01-18 10:20:11,877 DEBUG [qtp277169967-36] lipse.jetty.io.ManagedSelector - Queued change org.eclipse.jetty.io.ManagedSelector$2@1fbd3777 on org.eclipse.jetty.io.ManagedSelector@5e45d242 id=2 keys=1 selected=0
2016-01-18 10:20:11,877 DEBUG [qtp277169967-36] se.jetty.server.HttpConnection -
javax.net.ssl.SSLHandshakeException: no cipher suites in common
at sun.security.ssl.Handshaker.checkThrown(Handshaker.java:1364)
at sun.security.ssl.SSLEngineImpl.checkTaskThrown(SSLEngineImpl.java:529)
at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:807)
at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:775)
謝謝!
UPD:還有一個有趣的行為,如果我僅導入一個證書,它就可以正常工作,但是瀏覽器中出現ssl警告,該證書由另一個未提供的證書簽名。 如果我導入整個證書鏈,則會出現錯誤。
UPD 2:我為有問題的服務器運行了SSL檢查器,並且
Supported versions: TLSv1.0 TLSv1.1 TLSv1.2
Deflate compression: no
Supported cipher suites (ORDER IS NOT SIGNIFICANT):
TLSv1.0
RSA_WITH_RC4_128_MD5
RSA_WITH_RC4_128_SHA
RSA_WITH_3DES_EDE_CBC_SHA
DHE_RSA_WITH_3DES_EDE_CBC_SHA
RSA_WITH_AES_128_CBC_SHA
DHE_RSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_RC4_128_SHA
TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
(TLSv1.1: idem)
TLSv1.2
RSA_WITH_RC4_128_MD5
RSA_WITH_RC4_128_SHA
RSA_WITH_3DES_EDE_CBC_SHA
DHE_RSA_WITH_3DES_EDE_CBC_SHA
RSA_WITH_AES_128_CBC_SHA
DHE_RSA_WITH_AES_128_CBC_SHA
RSA_WITH_AES_128_CBC_SHA256
DHE_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_RC4_128_SHA
TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
----------------------
Server certificate(s):
XXX: CN=XXX, O=XXX, DC=XXX, DC=XXX
----------------------
Minimal encryption strength: strong encryption (96-bit or more)
Achievable encryption strength: strong encryption (96-bit or more)
我可以使用瀏覽器連接的服務器提供了相同的芯片列表,唯一的區別在於證書。
UPD 3:我在此unix服務器上檢查了證書是否還有另一個CN / SAN,它工作正常(只是拋出了無效的證書主機錯誤)。 看起來當CN / SAN記錄匹配時,它將運行導致此錯誤的附加驗證嗎?
簡而言之,您的客戶端提供的內容與服務器提供的內容不同。
這可能來自簡單的問題,例如您的證書是DSA格式,而您的客戶端不提供DSA(要解決此問題,請確保使用更現代的證書格式,至少是RSA或更高級)
由於一處漏洞或另一處漏洞,一堆密碼也被專門排除在外。
使用SSLEngine
獲取“受支持”列表並不能為您帶來真實的答案。 它只告訴您Java的能力,而不是您要遵循的特定連接器配置。
使用SslContextFactory
,但詢問其包含和排除的密碼套件是什么。 或僅打開SslContextFactory
調試,然后查看它產生的輸出(其中顯示了包含/排除的密碼和協議)。
更新:
您沒有提到它是SNI證書,從而大大縮小了范圍。
對於初學者,您必須將Jetty 9.3+與Java 8+一起使用,在服務器端沒有較舊版本的Jetty或Java支持SNI。
最后,確保已將SSL / TLS特定Connector
的SecureRequestCustomizer
添加到HttpConfiguration
中,並帶有可選的構造函數以啟用SNI
主機檢查。
在jetty-distribution
您可以執行以下操作...
$ mkdir snibase
$ cd snibase
$ java -jar /path/to/jetty-dist/start.jar --add-to-start=https,deploy
INFO: server initialised (transitively) in ${jetty.base}/start.ini
INFO: ssl initialised (transitively) in ${jetty.base}/start.ini
INFO: https initialised in ${jetty.base}/start.ini
INFO: deploy initialised in ${jetty.base}/start.ini
DOWNLOAD: http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/plain/jetty-server/src/test/config/etc/keystore?id=master to ${jetty.base}/etc/keystore
MKDIR: ${jetty.base}/webapps
INFO: Base directory was modified
$ grep sni start.ini
# jetty.ssl.sniHostCheck=true
$ edit start.ini
$ grep sni start.ini
jetty.ssl.sniHostCheck=true
看來我能夠修復它:在密鑰庫中,密鑰文件內和單獨存在證書。 我刪除了單獨的副本,它開始工作。 我不知道它如何解釋取決於主機名的問題,如果有人遇到相同問題,則只是發布解決方案。 UPD:它也有助於切換到.p12密鑰庫(其中只有證書鏈,沒有密鑰)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.