You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用App Auth接口时遭遇SSLHandshakeException异常求助

嘿,这个App Auth的SSL握手问题我太熟了——本质就是你的App不认目标服务器的SSL证书,导致SSL握手失败。给你几个实用的解决思路,按优先级来:

解决App Auth的SSLHandshakeException(证书信任锚点缺失)

1. 先排查服务器证书的合法性(优先做!)

  • 首先确认是不是服务器端的证书本身有问题:比如证书过期、域名和证书绑定的不匹配,或者生产环境用了自签名/私有CA证书(权威CA签发的证书App才会默认信任)。
  • 你可以直接用浏览器访问Auth服务器的发现文档URL(比如https://your-auth-server/.well-known/openid-configuration),看看浏览器会不会提示"证书不安全"。如果浏览器都不信任,那先搞定服务器端的证书配置再说。

2. 手动给App添加信任证书(测试/内部环境专用)

如果是测试服务器用的自签名证书,或者公司私有CA签发的证书,App默认不会认,得手动导入:

  • 第一步:导出服务器证书
    用openssl命令导出(终端里运行):
    openssl s_client -connect your-auth-server:443 < /dev/null | openssl x509 -outform PEM > server_cert.pem
    
    嫌命令麻烦的话,直接从浏览器导出也行(Chrome:点地址栏的锁图标→证书→详细信息→复制到文件→选Base64编码格式)。
  • 第二步:把证书放到App资源里
    把导出的.pem或.cer文件放到Android项目的res/raw目录(没有的话新建一个)。
  • 第三步:让AppAuth使用自定义的信任配置
    写代码创建自定义SSL上下文,让AppAuth用这个上下文去请求:
    // 加载我们导入的证书
    InputStream certInputStream = getResources().openRawResource(R.raw.server_cert);
    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    X509Certificate cert = (X509Certificate) cf.generateCertificate(certInputStream);
    
    // 把证书存入KeyStore
    KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
    keyStore.load(null, null);
    keyStore.setCertificateEntry("server_cert", cert);
    
    // 生成信任管理器
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    tmf.init(keyStore);
    TrustManager[] trustManagers = tmf.getTrustManagers();
    
    // 创建自定义SSLContext
    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(null, trustManagers, new SecureRandom());
    
    // 配置AppAuth使用这个SSL上下文
    AuthorizationServiceConfiguration config = new AuthorizationServiceConfiguration(
        Uri.parse("https://your-auth-server/auth"),
        Uri.parse("https://your-auth-server/token")
    );
    
    OkHttpClient client = new OkHttpClient.Builder()
        .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustManagers[0])
        .build();
    
    AuthorizationService authService = new AuthorizationService(this, new AppAuthOkHttpClient(client));
    
    ⚠️ 注意:这种方法只适合测试/内部环境,生产环境绝对不能用,必须用权威CA签发的证书!

3. 系统级信任证书(企业应用/已Root设备)

如果是企业内部应用,且设备被企业管理,可以把证书安装到设备的系统信任存储里——这样所有App都会自动信任这个证书,不用改代码:

  • 把证书转成.crt格式(部分设备要求),然后通过设备的「设置→安全→从存储安装证书」安装,选择「VPN和应用」类别就行。

4. 配置Android网络安全规则(Android 7.0+)

Android 7.0及以上默认不信任用户手动添加的证书,除非你在res/xml/network_security_config.xml里明确允许:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <!-- 替换成你的Auth服务器域名 -->
        <domain includeSubdomains="true">your-auth-server.com</domain>
        <trust-anchors>
            <!-- 信任我们导入的证书 -->
            <certificates src="@raw/server_cert"/>
            <!-- 如果同时要信任系统默认的CA,加上这行 -->
            <certificates src="system"/>
        </trust-anchors>
    </domain-config>
</network-security-config>

然后在AndroidManifest.xml的<application>标签里加上引用:

android:networkSecurityConfig="@xml/network_security_config"

内容的提问来源于stack exchange,提问作者Manu Ram V

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:54:25