Android HttpsURLConnection 在后端禁用密码套件后给出 SSLHandshakeException

问题描述 投票:0回答:1

我们的后端是 Azure 应用服务 (Linux),默认设置支持以下密码套件:

TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_128_CBC_SHA

当我禁用所有密码但前两个密码时,到后端的所有 http 连接都会失败并出现异常

javax.net.ssl.SSLHandshakeException:连接已关闭

我们有以下代码:

URL url = new URL(urlString);
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestMethod("GET");

SSLSocketFactory factory = connection.getSSLSocketFactory()
String[] cipherSuites = factory.getSupportedCipherSuites();
for (String suite : cipherSuites) {
    System.out.println(suite);
}

connection.connect();

添加 SSLSocketFactory 只是为了打印支持的密码套件。输出是:

TLS_AES_128_GCM_SHA256
TLS_AES_256_GCM_SHA384
TLS_CHACHA20_POLY1305_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_128_GCM_SHA256 TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_PSK_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_PSK_WITH_AES_256_CBC_SHA
SSL_RSA_WITH_3DES_EDE_CBC_SHA
TLS_EMPTY_RENEGOTIATION_INFO_SCSV
TLS_FALLBACK_SCSV

所以至少是第一个密码,例如TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 似乎两者都支持。

由于各种历史原因,该应用程序的最低 sdk 和目标 sdk 为 28

minSdkVersion 28
targetSdkVersion 28

为什么握手找不到共同的密码?

java android ssl httpurlconnection
1个回答
0
投票

当我禁用所有密码但前两个密码时,到后端的所有 http 连接都会失败并出现异常

这意味着剩下以下密码:

TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256

两者都需要 ECDSA 身份验证,这意味着它们需要 ECC 证书。也许您只有 RSA 证书,这意味着服务器不支持任何可以与服务器使用的证书一起使用的密码。

© www.soinside.com 2019 - 2024. All rights reserved.