OkHttp 中的 ConnectionSpec 是一个类,用于定义客户端和服务器之间的连接配置,主要包括协议版本(如 TLS 或 HTTP/1.1)、加密套件(Cipher Suites)和其他安全设置。
1. ConnectionSpec 的作用
-
定义连接安全性:
- 决定是否使用 HTTPS(TLS)或者明文连接(HTTP)。
- 配置支持的加密套件和协议。
-
提高灵活性:
- 提供多种连接配置选项,满足不同的安全需求或兼容性要求。
-
适配服务器需求:
- 确保客户端支持服务器所需的协议和加密套件,避免连接失败。
2. ConnectionSpec 的构造
ConnectionSpec 提供了两种主要的预定义配置:
1. ConnectionSpec.MODERN_TLS
-
默认的安全配置,用于支持现代 TLS 连接。
-
特点:
- 支持 TLS 1.2 和 TLS 1.3(如果设备支持)。
- 使用一组推荐的加密套件。
- 提供较高的安全性。
2. ConnectionSpec.CLEARTEXT
-
用于非加密的明文连接(HTTP)。
-
特点:
- 不启用 TLS 加密。
- 仅适用于可信网络,或者需要兼容明文 HTTP 的场景。
自定义 ConnectionSpec
如果需要更精细的配置,可以通过 ConnectionSpec.Builder 自定义:
java
复制代码
ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
.tlsVersions(TlsVersion.TLS_1_2, TlsVersion.TLS_1_3)
.cipherSuites(
CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
)
.build();
3. 重要方法
tlsVersions()
-
设置支持的 TLS 版本。
-
示例:
java 复制代码 .tlsVersions(TlsVersion.TLS_1_2, TlsVersion.TLS_1_3)
cipherSuites()
-
设置支持的加密套件。
-
示例:
java 复制代码 .cipherSuites(CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256)
supportsTlsExtensions()
- 指定是否支持 TLS 扩展(如 Server Name Indication, SNI)。
- 默认情况下,
MODERN_TLS是启用的。
4. 使用 ConnectionSpec
ConnectionSpec 在 OkHttp 中通过 OkHttpClient 的 connectionSpecs 方法进行设置:
java
复制代码
OkHttpClient client = new OkHttpClient.Builder()
.connectionSpecs(Arrays.asList(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))
.build();
- 上述代码同时支持现代 TLS 和明文连接。
- 根据服务器的响应,OkHttp 会自动选择合适的连接配置。
5. 典型场景
1. 强制使用 HTTPS
如果应用只允许 HTTPS,可以仅使用 MODERN_TLS:
java
复制代码
OkHttpClient client = new OkHttpClient.Builder()
.connectionSpecs(Collections.singletonList(ConnectionSpec.MODERN_TLS))
.build();
2. 兼容旧系统
某些旧系统可能仅支持 TLS 1.1 或不支持推荐的加密套件,可以自定义配置:
java
复制代码
ConnectionSpec legacySpec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
.tlsVersions(TlsVersion.TLS_1_0, TlsVersion.TLS_1_1)
.cipherSuites(
CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA,
CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA
)
.build();
OkHttpClient client = new OkHttpClient.Builder()
.connectionSpecs(Arrays.asList(legacySpec))
.build();
6. 注意事项
-
安全性与兼容性权衡:
MODERN_TLS提供最高的安全性,但可能与某些老旧服务器不兼容。- 对兼容性要求高的场景,可以通过自定义配置适配。
-
CLEARTEXT 的使用:
- 明文连接应尽量避免使用,特别是在生产环境中。
- 如果必须使用,需确保网络环境的安全。
-
服务器配置影响:
- 客户端的配置需要与服务器的协议版本和加密套件匹配,否则可能导致连接失败。