如何在Android项目中添加SSL证书及.jks信任库文件?
在Android项目中配置SSL证书实现安全连接
别担心,我来一步步帮你搞定这个SSL配置的事儿,刚接触的时候确实容易懵,咱们慢慢捋:
1. 先把证书文件安置好
- 打开你的Android项目,找到
app/src/main/res目录,要是没有raw文件夹就新建一个——这个目录专门放原生资源文件,很适合存证书。 - 把同事给你的
.crt公钥文件和.jks信任库文件都复制到raw里。注意文件名要全小写,别用空格或特殊字符,比如改成server_cert.crt和my_trust_store.jks,避免后续代码里出奇怪的问题。
2. 方式一:用JKS信任库配置SSL(推荐)
如果你的项目用OkHttp(现在Android开发大多用这个),可以这么加载信任库:
// 加载JKS信任库 val trustStore = KeyStore.getInstance("JKS") val inputStream = resources.openRawResource(R.raw.my_trust_store) // 这里替换成同事给你的JKS密码 trustStore.load(inputStream, "your_jks_password".toCharArray()) // 创建信任管理器 val trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()) trustManagerFactory.init(trustStore) // 初始化SSL上下文 val sslContext = SSLContext.getInstance("TLS") sslContext.init(null, trustManagerFactory.trustManagers, SecureRandom()) // 配置OkHttpClient,后续用它发请求就会走SSL了 val okHttpClient = OkHttpClient.Builder() .sslSocketFactory(sslContext.socketFactory, trustManagerFactory.trustManagers[0] as X509TrustManager) .build()
要是用原生的HttpsURLConnection,逻辑差不多:
val trustStore = KeyStore.getInstance("JKS") val inputStream = resources.openRawResource(R.raw.my_trust_store) trustStore.load(inputStream, "your_jks_password".toCharArray()) val trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()) trustManagerFactory.init(trustStore) val sslContext = SSLContext.getInstance("TLS") sslContext.init(null, trustManagerFactory.trustManagers, SecureRandom()) val url = URL("https://你的服务器地址") val connection = url.openConnection() as HttpsURLConnection connection.sslSocketFactory = sslContext.socketFactory // 接下来就像之前那样读取数据就行
3. 方式二:直接用CRT公钥文件
如果你不想依赖JKS,也可以直接把CRT证书导入信任管理器:
// 读取CRT证书 val certInputStream = resources.openRawResource(R.raw.server_cert) val certificateFactory = CertificateFactory.getInstance("X.509") val certificate = certificateFactory.generateCertificate(certInputStream) as X509Certificate // 创建临时信任库并添加证书 val trustStore = KeyStore.getInstance(KeyStore.getDefaultType()) trustStore.load(null, null) trustStore.setCertificateEntry("server_cert", certificate) // 后面的步骤和方式一一样:创建信任管理器、初始化SSL上下文、配置客户端 val trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()) trustManagerFactory.init(trustStore) val sslContext = SSLContext.getInstance("TLS") sslContext.init(null, trustManagerFactory.trustManagers, SecureRandom()) // 配置OkHttpClient或HttpsURLConnection即可
几个要注意的点
- 一定要确认JKS的密码是对的,不然加载信任库会直接失败。
- 如果你们服务器用的是自签名证书(不是CA颁发的),这样配置后就不会再出现SSL握手失败的错误了。
- 要是用Retrofit,只需要把配置好的
OkHttpClient传给Retrofit Builder就行:
val retrofit = Retrofit.Builder() .baseUrl("https://你的服务器地址") .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .build()
内容的提问来源于stack exchange,提问作者user9267819
相关产品推荐
相关产品推荐

