返回

Android N 步步配置 HTTPS 单向/双向认证请求

Android

前言

HTTPS(超文本传输安全协议)是一种安全协议,可通过在 HTTP 上添加 SSL/TLS 加密层来保护数据传输。它对于保护敏感信息,如财务数据和个人身份信息,至关重要。

在 Android N 中,引入了一项新功能,允许应用程序配置 HTTPS 单向和双向认证请求。单向认证要求服务器提供证书,而客户端信任该证书。双向认证要求客户端和服务器都提供证书才能建立连接。

本指南将逐步介绍如何在 Android N 中配置 HTTPS 单向/双向认证请求。它将涵盖前提条件、配置步骤、常见问题和故障排除技巧。

先决条件

  • Android N 及更高版本
  • 具有有效 SSL/TLS 证书的服务器
  • 对于双向认证,客户端证书(.pem 格式)

配置步骤

1. 配置服务器

  • 生成或获取有效 SSL/TLS 证书。
  • 根据证书颁发机构 (CA) 的说明配置服务器以支持 HTTPS。

2. 创建 TrustManager

  • 创建一个 TrustManager,负责验证服务器证书。对于单向认证,使用 TrustManagerFactory.getDefaultInstance("SSL") 创建一个默认的 TrustManager。对于双向认证,使用 TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()) 创建一个新的 TrustManager。
  • 如果使用双向认证,请将客户端证书加载到 KeyStore 中并将其设置为 TrustManager。

3. 创建 SSLContext

  • 使用 TrustManager 创建一个 SSLContext。对于单向认证,使用 SSLContext.getInstance("TLS")。对于双向认证,使用 SSLContext.getInstance("TLSv1.2")
  • 将 SSLContext 设置为 HttpsURLConnection

4. 建立 HTTPS 连接

  • 使用 HttpsURLConnection 建立到服务器的 HTTPS 连接。
  • 对于单向认证,跳过证书验证。
  • 对于双向认证,提供客户端证书。

示例代码

单向认证

TrustManager[] trustAllCerts = TrustManagerFactory.getDefaultInstance("SSL").getTrustManagers();
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setSSLSocketFactory(sslContext.getSocketFactory());

双向认证

KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(new FileInputStream(clientCertificatePath), clientCertificatePassword);
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setSSLSocketFactory(sslContext.getSocketFactory());

常见问题解答

  • 如何处理自签名证书?

    自签名证书不被大多数设备信任。为了使用自签名证书,需要将其添加到设备的受信任证书存储中。

  • 双向认证失败的原因是什么?

    • 客户端证书无效或不受服务器信任。
    • 服务器没有配置为接受客户端证书。
    • SSLContext 使用的协议版本与服务器不兼容。

故障排除技巧

  • 使用 okhttp3.OkHttpClient.Builder.addNetworkInterceptor() 添加一个拦截器以记录 HTTP 请求和响应。
  • 使用 adb logcat 命令查看设备日志以查找错误消息。
  • 确保服务器和客户端都使用兼容的 SSL/TLS 版本。
  • 确保服务器和客户端的时钟是同步的。

结论

通过遵循本指南,开发人员可以轻松地在 Android N 中配置 HTTPS 单向/双向认证请求。这些请求可显著提高应用程序与 HTTPS 服务之间的通信安全性。