调用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命令导出(终端里运行):
嫌命令麻烦的话,直接从浏览器导出也行(Chrome:点地址栏的锁图标→证书→详细信息→复制到文件→选Base64编码格式)。openssl s_client -connect your-auth-server:443 < /dev/null | openssl x509 -outform PEM > server_cert.pem - 第二步:把证书放到App资源里
把导出的.pem或.cer文件放到Android项目的res/raw目录(没有的话新建一个)。 - 第三步:让AppAuth使用自定义的信任配置
写代码创建自定义SSL上下文,让AppAuth用这个上下文去请求:
⚠️ 注意:这种方法只适合测试/内部环境,生产环境绝对不能用,必须用权威CA签发的证书!// 加载我们导入的证书 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));
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
相关产品推荐
相关产品推荐

