android volley https报错了,采用自签名证书

在 Android 开发中,使用 Volley 库进行 HTTPS 请求时,如果遇到使用自签名证书的错误,通常是因为自签名证书未被系统信任。解决这个问题需要在 Volley 的请求中配置一个自定义的 SSLSocketFactory 以信任自签名证书。以下是详细的解决步骤:

1. 生成自签名证书

如果尚未生成自签名证书,可以使用 keytool 命令生成。例如:

bash
keytool -genkeypair -alias mycert -keyalg RSA -keysize 2048 -keystore mycert.jks -validity 365

2. 将自签名证书转换为 PEM 格式

.jks 文件中的证书导出为 PEM 格式:

bash
keytool -exportcert -alias mycert -keystore mycert.jks -rfc -file mycert.pem

3. 在 Android 项目中信任自签名证书

在项目中配置一个自定义的 SSLSocketFactory,使其信任自签名证书。具体步骤如下:

a. 将证书文件放入 res/raw 目录

将自签名证书(mycert.pem)放入 res/raw 目录中(创建 raw 目录如果不存在)。

b. 创建自定义 SSLSocketFactory

创建一个自定义的 SSLSocketFactory 类来加载证书,并配置 HTTPS 连接信任自签名证书:

java
import android.content.Context; import com.android.volley.toolbox.HurlStack; import com.android.volley.toolbox.HttpStack; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.SSLSocketFactory; import java.io.InputStream; import java.security.KeyStore; public class CustomHurlStack extends HurlStack { private Context mContext; public CustomHurlStack(Context context) { this.mContext = context; } @Override protected SSLSocketFactory createSslSocketFactory() { try { // Load the self-signed certificate from res/raw KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); InputStream inputStream = mContext.getResources().openRawResource(R.raw.mycert); keyStore.load(inputStream, "password".toCharArray()); // Create a TrustManager that trusts the self-signed certificate TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(keyStore); // Initialize SSLContext with the TrustManager SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, trustManagerFactory.getTrustManagers(), null); return sslContext.getSocketFactory(); } catch (Exception e) { throw new RuntimeException(e); } } }

c. 使用自定义的 SSLSocketFactory

在创建 Volley 请求队列时,使用自定义的 HurlStack

java
import com.android.volley.RequestQueue; import com.android.volley.toolbox.Volley; // Initialize the request queue RequestQueue requestQueue = Volley.newRequestQueue(context, new CustomHurlStack(context)); // Now you can use the request queue to add requests

4. 调试和验证

确保你的自签名证书配置正确并且没有过期。可以通过使用工具如 Postman 测试 HTTPS 请求是否能正确响应,以验证配置是否有效。

5. 注意事项

  • 证书密码:在 keyStore.load 方法中,替换 "password" 为实际的密钥库密码。
  • API 级别:Android 7.0(API 级别 24)及以上版本的设备可能需要额外配置以支持自签名证书。

关键字

Android, Volley, HTTPS, 自签名证书, SSLSocketFactory, HurlStack, KeyStore, TrustManager, SSLContext, 证书配置, 请求队列