Java 在Spring Boot中启用TLSv1密码

Java 在Spring Boot中启用TLSv1密码,java,android,spring,ssl,tls1.2,Java,Android,Spring,Ssl,Tls1.2,我试图在我的spring boot REST服务中启用TLSv1密码,以便旧的android客户端可以连接到它,但由于某些原因,它无法工作。我正在运行openjdk版本“1.8.0_131”,默认情况下TLSv1、TLSv1.1和TLSv1.2似乎已启用 我正在使用nmap--scriptssl枚举密码-p8443127.0.0.1扫描服务器可以获取的内容,我得到了这个结果 8443/tcp open https-alt | ssl-enum-ciphers: | TLSv1.2: |

我试图在我的spring boot REST服务中启用TLSv1密码,以便旧的android客户端可以连接到它,但由于某些原因,它无法工作。我正在运行
openjdk版本“1.8.0_131”
,默认情况下TLSv1、TLSv1.1和TLSv1.2似乎已启用
我正在使用
nmap--scriptssl枚举密码-p8443127.0.0.1
扫描服务器可以获取的内容,我得到了这个结果

8443/tcp open  https-alt
| ssl-enum-ciphers: 
|   TLSv1.2: 
|     ciphers: 
|       TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 (secp256k1) - A
|       TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 (secp521r1) - A
|       TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 (secp521r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 (secp256k1) - A
|       TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 (secp521r1) - A
|       TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 (secp521r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 (secp256k1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (secp256k1) - A
|       TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 (secp521r1) - A
|       TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 (secp521r1) - A
|       TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 (secp521r1) - A
|       TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 (secp521r1) - A
|     compressors: 
|       NULL
|     cipher preference: server
|     warnings: 
|       Key exchange (secp256k1) of lower strength than certificate key
|_  least strength: A
没有成功的TLSv1或TLSv1.1。但他们不是残疾人!我之所以知道这一点,是因为当我通过在服务器ssl日志上设置
server.ssl.enabled protocols=TLSv1.2
来禁用它们时

javax.net.ssl.SSLHandshakeException: Client requested protocol TLSv1.1 not enabled or not supported
当我删除该行时(因此再次启用默认值),我看不到该错误。我看到的是

javax.net.ssl.SSLHandshakeException: no cipher suites in common
这是nmap扫描发送的密码列表,这是一个巨大的列表,因此很难相信TLSv1或TLSv1.1中没有共同点:

Cipher Suites: [Unknown 0xc0:0xa9, TLS_PSK_WITH_AES_256_GCM_SHA384, Unknown 0xc0:0x64, Unknown 0xc0:0x6a, Unknown 0xc0:0x65, Unknown 0xc0:0x6b, Unknown 0xc0:0x94, Unknown 0xc0:0x8e, Unknown 0xc0:0x95, Unknown 0xc0:0x8f, Unknown 0xcc:0xab, TLS_PSK_WITH_NULL_SHA, TLS_PSK_WITH_NULL_SHA256, TLS_PSK_WITH_NULL_SHA384, TLS_PSK_WITH_RC4_128_SHA, SSL_RSA_EXPORT1024_WITH_DES_CBC_SHA, Unknown 0x0:0x61, Unknown 0x0:0x60, SSL_RSA_EXPORT1024_WITH_RC4_56_SHA, SSL_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5, SSL_RSA_EXPORT_WITH_RC4_40_MD5, TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA, TLS_RSA_PSK_WITH_AES_128_CBC_SHA, TLS_RSA_PSK_WITH_AES_128_CBC_SHA256, TLS_RSA_PSK_WITH_AES_128_GCM_SHA256, TLS_RSA_PSK_WITH_AES_256_CBC_SHA, TLS_RSA_PSK_WITH_AES_256_CBC_SHA384, TLS_RSA_PSK_WITH_AES_256_GCM_SHA384, Unknown 0xc0:0x68, Unknown 0xc0:0x6e, Unknown 0xc0:0x69, Unknown 0xc0:0x6f, Unknown 0xc0:0x98, Unknown 0xc0:0x92, Unknown 0xc0:0x99, Unknown 0xc0:0x93, Unknown 0xcc:0xae, TLS_RSA_PSK_WITH_NULL_SHA, TLS_RSA_PSK_WITH_NULL_SHA256, TLS_RSA_PSK_WITH_NULL_SHA384, TLS_RSA_PSK_WITH_RC4_128_SHA, Unknown 0x0:0x7c, SSL_RSA_WITH_3DES_EDE_CBC_SHA, Unknown 0x0:0x7d, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA256, Unknown 0xc0:0x9c, Unknown 0xc0:0xa0, TLS_RSA_WITH_AES_128_GCM_SHA256, Unknown 0x0:0x7e, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA256, Unknown 0xc0:0x9d, Unknown 0xc0:0xa1, TLS_RSA_WITH_AES_256_GCM_SHA384, Unknown 0xc0:0x3c, Unknown 0xc0:0x50]
在某些背景下,我尝试启用TLSv1,希望我的android 4.4.4客户端能够连接。当nmap发送其密码列表时,它具有与nmap相同的错误,即没有公共密码套件。然而,nmap成功地使用了一些TLSv1.2密码,android却没有,因为它支持的密码更少。所以我尝试在android中启用更多密码(似乎更难/不可能),或者在我的服务器中启用更多密码(似乎更容易)。这些是android在ClientHello中发送的密码

TLS_RSA_WITH_AES_128_CBC_SHA,
TLS_RSA_WITH_AES_256_CBC_SHA,
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, 
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, 
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, 
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
SSL_RSA_WITH_3DES_EDE_CBC_SHA,
TLS_EMPTY_RENEGOTIATION_INFO_SCSV

如果我在spring中使用
server.ssl.ciphers
显式地只启用那些密码,nmap显示实际上根本没有接受任何密码。是什么原因导致spring/java/Somethingels无法启用android尝试使用的任何(通用和标准)密码?

在我的案例中,问题不在于TLS版本没有启用。这是密码的签名算法

Jetty禁用了所有使用SHA1或MD5的密码,从客户列表中可以看出,在我的例子中,它们都是SHA1密码。这在码头代码中

SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setExcludeCipherSuites(
        "^.*_(MD5|SHA|SHA1)$");
更多细节

为了解决这个问题,我创建了一个显式的密码列表,用于spring引导配置(使用config属性
server.ssl.ciphers
),在这里我启用了SHA1密码


我不得不说,至少在TLS1.2中使用它时,这个jetty决策对我来说似乎没有必要(尽管我不是安全专家)。要点是,使用SHA1签署证书肯定不安全,但在HMAC中使用使用SHA1的密码套件仍然被认为是安全的

我完全同意。做这样的决定不是Jetty的事。这应该取决于安装程序/配置程序。我花了6个小时找到这个答案,并在Jetty升级后处理我们产品中的同一问题。你能分享一下你是如何在Spring引导配置中创建这些显式密码列表的吗?@chelute我已经更新了我的答案。简而言之,在您的配置文件中的key
server.ssl.ciphers
下设置它们。你可以看到一个例子