在 Spring 引导中启用 TLSv1 密码
Enable TLSv1 ciphers in Spring Boot
我正在尝试在我的 spring 引导 REST 服务中启用 TLSv1 密码,以便较旧的 android 客户端可以连接到它,但由于某种原因它不工作。我是 运行 openjdk version "1.8.0_131"
,默认情况下 TLSv1、TLSv1.1 和 TLSv1.2 似乎已启用
我正在使用 nmap --script ssl-enum-ciphers -p 8443 127.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。但他们没有残疾!我知道这一点,因为当我通过设置 server.ssl.enabled-protocols=TLSv1.2
禁用它们时,在服务器 ssl 日志上我看到
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 中有 none 共同点:
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 有相同的 no cipher suites in common
错误。然而 nmap 使用一些 TLSv1.2 密码成功,android 没有,因为它支持较少的密码。因此,我正在尝试在 android(似乎 harder/impossible)中启用更多密码,或者在我的服务器中启用更多密码(似乎更容易)。这些是 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
如果我使用 server.ssl.ciphers
显式仅启用 spring 中的密码,nmap 会显示实际上根本没有密码被接受。是什么导致 spring/java/somethingelse 无法启用 android 尝试使用的任何(通用和标准)密码?
我的问题不是未启用 TLS 版本。它与密码的签名算法有关。
Jetty 禁用了所有使用 SHA1 或 MD5 的密码,从客户端列表中可以看出,在我的例子中它们都是 SHA1 密码。这是在码头代码
SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setExcludeCipherSuites(
"^.*_(MD5|SHA|SHA1)$");
更多详情here
为了修复它,我创建了一个明确的密码列表,用于我的 spring 启动配置(使用配置 属性 server.ssl.ciphers
),我在其中启用了 SHA1 密码
我不得不说,基于 this post(虽然我不是安全专家),至少在将它与 TLS1.2 一起使用时,这个码头决定对我来说似乎是不必要的。要点是 绝对 不安全的是使用 SHA1 签署证书,但是使用在其 HMAC 中使用 SHA1 的密码套件仍然被认为是安全的
我正在尝试在我的 spring 引导 REST 服务中启用 TLSv1 密码,以便较旧的 android 客户端可以连接到它,但由于某种原因它不工作。我是 运行 openjdk version "1.8.0_131"
,默认情况下 TLSv1、TLSv1.1 和 TLSv1.2 似乎已启用
我正在使用 nmap --script ssl-enum-ciphers -p 8443 127.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。但他们没有残疾!我知道这一点,因为当我通过设置 server.ssl.enabled-protocols=TLSv1.2
禁用它们时,在服务器 ssl 日志上我看到
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 中有 none 共同点:
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 有相同的 no cipher suites in common
错误。然而 nmap 使用一些 TLSv1.2 密码成功,android 没有,因为它支持较少的密码。因此,我正在尝试在 android(似乎 harder/impossible)中启用更多密码,或者在我的服务器中启用更多密码(似乎更容易)。这些是 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
如果我使用 server.ssl.ciphers
显式仅启用 spring 中的密码,nmap 会显示实际上根本没有密码被接受。是什么导致 spring/java/somethingelse 无法启用 android 尝试使用的任何(通用和标准)密码?
我的问题不是未启用 TLS 版本。它与密码的签名算法有关。
Jetty 禁用了所有使用 SHA1 或 MD5 的密码,从客户端列表中可以看出,在我的例子中它们都是 SHA1 密码。这是在码头代码
SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setExcludeCipherSuites(
"^.*_(MD5|SHA|SHA1)$");
更多详情here
为了修复它,我创建了一个明确的密码列表,用于我的 spring 启动配置(使用配置 属性 server.ssl.ciphers
),我在其中启用了 SHA1 密码
我不得不说,基于 this post(虽然我不是安全专家),至少在将它与 TLS1.2 一起使用时,这个码头决定对我来说似乎是不必要的。要点是 绝对 不安全的是使用 SHA1 签署证书,但是使用在其 HMAC 中使用 SHA1 的密码套件仍然被认为是安全的