" Jetty中没有共同的密码套件“错误

时间:2016-01-15 15:13:48

标签: java ssl cryptography jetty

我在Jetty中设置了ssl连接器。它在我的运行Windows 7的开发机器上工作正常,但在Linux开发服务器上失败:Chrome / IE / C#客户端无法打开网页,并且#Jet;没有共同的密码套件“显示在Jetty调试日志中。 我从SslConnectionFactory获取了javax.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记录匹配时,会运行导致此错误的其他验证吗?

2 个答案:

答案 0 :(得分:1)

简而言之,您的客户提供的服务以及服务器具有的不同之处。

这可能来自您的证书是DSA格式那么简单,而您的客户端不提供DSA(要解决此问题,请确保使用更现代的证书格式,至少RSA或更好)

还有一大堆密码由于一个漏洞或其他漏洞而被明确排除。

使用SSLEngine获取“支持”列表并不能让您获得真实的答案。所有它告诉你的是你的Java能力,而不是你设置的特定连接器配置。

使用SslContextFactory,但询问其包含和排除的密码套件是什么。或者只是打开SslContextFactory的调试并查看它产生的输出(显示包含/排除的密码和协议)。

<强>更新

你没有提到它是一张SNI证书,它显着缩小了范围。

对于初学者,您必须使用Jetty 9.3+,Java 8+,服务器端没有旧版本的Jetty或Java支持SNI。

最后,请确保在您的SSL / TLS特定SecureRequestCustomizer中添加HttpConfiguration Connector,并使用可选构造函数启用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

答案 1 :(得分:1)

看起来我能够修复它:在密钥库中,密钥文件中有证书并且单独存在。我删除了单独的副本,它开始工作。我不知道它是如何解释一个取决于主机名的问题,只是如果有人遇到同样的问题就发布解决方案。 UPD:它也有助于切换到.p12密钥库(其中只有证书链在里面,没有密钥)。