簡體   English   中英

Jetty中的“沒有共同的密碼套件”錯誤

[英]"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特定ConnectorSecureRequestCustomizer添加到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM