Android KeyChain选择证书后是否自动加入应用后续网络请求?
关于Android KeyChain证书是否自动注入网络请求的解答
好问题!答案是不会自动添加哦。
Android的KeyChain本质上是一个安全的凭证存储容器,当用户通过KeyChain.choosePrivateKeyAlias选择证书后,你的应用只是获得了访问该证书对应私钥和证书链的权限——系统并不会自动把这些凭证注入到你后续发起的所有网络请求里,这一步需要你手动配置网络请求的SSL上下文。
举两个常见网络请求库的配置例子:
1. 使用HttpsURLConnection的配置步骤
- 首先通过别名获取凭证:
PrivateKey privateKey = KeyChain.getPrivateKey(context, selectedAlias); X509Certificate[] certChain = KeyChain.getCertificateChain(context, selectedAlias); - 构建自定义的SSLContext,把凭证绑定进去:
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); KeyStore keyStore = KeyStore.getInstance("PKCS12"); keyStore.load(null, null); // 将证书链和私钥存入KeyStore keyStore.setKeyEntry("client", privateKey, null, certChain); kmf.init(keyStore, null); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(kmf.getKeyManagers(), null, null); - 给HttpsURLConnection设置自定义的SSLSocketFactory:
HttpsURLConnection urlConnection = (HttpsURLConnection) new URL("https://your-api-url").openConnection(); urlConnection.setSSLSocketFactory(sslContext.getSocketFactory());
2. 使用OkHttp的配置步骤
- 同样先获取凭证,然后构建自定义的SSLSocketFactory:
// 先获取privateKey和certChain,步骤同上 KeyStore keyStore = KeyStore.getInstance("PKCS12"); keyStore.load(null, null); keyStore.setKeyEntry("client", privateKey, null, certChain); KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmf.init(keyStore, null); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(kmf.getKeyManagers(), null, null); - 配置OkHttpClient:
OkHttpClient client = new OkHttpClient.Builder() .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()).getTrustManagers()[0]) .build(); - 之后用这个client发起的请求就会携带你的证书凭证了。
另外补充一点:如果你的PKCS12里包含的是CA根证书,并且是安装到系统信任区的,那么系统默认的SSL信任管理器会自动信任该CA签发的证书,但如果是用于双向认证的客户端证书,还是必须手动绑定到请求中才行。
内容的提问来源于stack exchange,提问作者Kannan_SJD
相关产品推荐
相关产品推荐

