You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关于Android Studio配置证书路径信任锚及解决开发环境证书验证异常的咨询

Android Studio配置证书路径信任锚及解决开发环境证书验证异常的咨询

嘿,我来帮你搞定这个开发环境的证书问题!既然后端没法调整,那咱们就从Android客户端这边入手,给你整理了几个靠谱的方案,按需选就行:

方案1:把开发服务器证书添加到项目信任库(推荐,相对安全)

这个方法是把开发环境的证书加到App的信任列表里,既解决问题又不会像完全跳过验证那样有安全风险:

  1. 导出开发服务器的证书
    打开浏览器访问你的开发环境地址,点击地址栏的锁图标 → 查看证书 → 导出为X.509证书(.crt)格式的文件。

  2. 把证书放到项目里
    在你的Android项目中,新建app/src/main/res/raw目录(如果没有的话),把导出的证书文件放进去,比如命名为dev_server_cert.crt

  3. 自定义信任管理器加载证书
    写一个工具类来加载这个证书并创建自定义的SSL上下文,代码示例如下:

    import android.content.Context;
    import java.io.InputStream;
    import java.security.KeyStore;
    import java.security.cert.CertificateFactory;
    import java.security.cert.X509Certificate;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.TrustManagerFactory;
    
    public class SSLUtil {
        public static SSLContext getCustomSSLContext(Context context) throws Exception {
            // 加载raw目录下的证书
            CertificateFactory cf = CertificateFactory.getInstance("X.509");
            InputStream certInputStream = context.getResources().openRawResource(R.raw.dev_server_cert);
            X509Certificate cert = (X509Certificate) cf.generateCertificate(certInputStream);
            certInputStream.close();
    
            // 创建包含该证书的KeyStore
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            keyStore.load(null, null);
            keyStore.setCertificateEntry("dev_cert", cert);
    
            // 初始化TrustManagerFactory
            TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            tmf.init(keyStore);
    
            // 创建SSLContext
            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, tmf.getTrustManagers(), null);
            return sslContext;
        }
    }
    
  4. 给网络请求框架配置自定义SSLContext
    如果你用的是OkHttp(大部分Android项目都用这个),就把这个SSLContext配置到OkHttpClient里:

    // 先获取TrustManagerFactory实例(可以在SSLUtil里暴露或者本地获取)
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    tmf.init(keyStore); // 这里的keyStore和SSLUtil里的是同一个
    
    OkHttpClient client = new OkHttpClient.Builder()
            .sslSocketFactory(SSLUtil.getCustomSSLContext(getApplicationContext()).getSocketFactory(),
                    (X509TrustManager) tmf.getTrustManagers()[0])
            .build();
    

    这样你的App就会信任开发服务器的证书了。

方案2:开发环境临时跳过证书验证(仅用于开发,绝对不能上线!)

如果只是想快速调试,不想折腾证书导出导入,可以用这个方法,但一定要用BuildConfig.DEBUG包裹,确保生产环境不会生效

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.cert.X509Certificate;

// 仅在Debug模式下使用!
if (BuildConfig.DEBUG) {
    try {
        // 创建不验证证书的TrustManager
        TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {
                    public X509Certificate[] getAcceptedIssuers() {
                        return new X509Certificate[0];
                    }
                    public void checkClientTrusted(X509Certificate[] certs, String authType) {}
                    public void checkServerTrusted(X509Certificate[] certs, String authType) {}
                }
        };

        // 初始化SSLContext
        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

        // 配置到OkHttp
        OkHttpClient client = new OkHttpClient.Builder()
                .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustAllCerts[0])
                .hostnameVerifier((hostname, session) -> true) // 跳过主机名验证
                .build();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

⚠️ 划重点:这个方法会完全绕过证书验证,绝对不能在生产环境使用,一定要用BuildConfig.DEBUG做判断,避免上线后出现安全漏洞。

方案3:给Android模拟器添加系统信任证书(无需改代码)

如果你用的是Android模拟器,可以把证书加到模拟器的系统信任列表里,这样所有App都会信任这个证书:

  1. 先把导出的.crt证书重命名为「证书哈希值.0」—— 可以用这个命令计算哈希值:openssl x509 -subject_hash_old -in dev_server_cert.crt | head -1
  2. 用adb把证书推到模拟器的系统目录:
    adb root
    adb remount
    adb push 证书哈希值.0 /system/etc/security/cacerts/
    adb shell chmod 644 /system/etc/security/cacerts/证书哈希值.0
    
  3. 重启模拟器,之后模拟器里的App就会信任这个开发证书了。不过这个方法需要模拟器开启root权限,部分官方模拟器需要手动开启该权限后才能操作。

最后再提醒几句

  • 优先选方案1,安全合规,不会留下安全隐患
  • 方案2只能临时用,一定要做好环境判断,别把危险代码弄到生产包
  • 生产环境正常是因为生产服务器的证书是受系统信任的正规证书,开发环境一般是自签证书,所以才会出现「信任锚找不到」的报错

如果操作中遇到细节问题,随时喊我哈!

火山引擎 最新活动