在Android开发中,SSL证书的配置和锁定对于确保客户端与服务端之间的通信安全至关重要,下面将详细探讨Android端SSL证书的设置、使用以及相关技术细节。
一、常规SSL证书设置
通常情况下,由CA(Certificate Authority)权威机构签发的证书,其根证书都内置在最新的Android操作系统中,默认情况下,开发者无需进行额外的SSL证书锁定操作,只需简单地使用HttpsURLConnection
或OkHttpClient
等网络框架发起HTTPS请求即可。
Java方法:
URL url = new URL("https://infinisign.com"); HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection(); urlConnection.connect(); InputStream in = urlConnection.getInputStream();
Kotlin方法:
val url = URL("https://infinisign.com") val urlConnection = url.openConnection() as HttpsURLConnection urlConnection.connect() urlConnection.inputStream.use { ... }
二、网络安全性设置
为了增强应用的安全性,防止中间人攻击(MITM),Android提供了网络安全性配置功能,此功能需要依赖Android N(API 24)及以后版本,开发者可以在APP开发阶段内置安全性设置,以达到更高的安全保障。
1、创建配置文件:
在res/xml
目录下创建network_security_config.xml
文件,并配置需要锁定的域名及其证书指纹。
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="false"> <domain includeSubdomains="true">infinisign.com</domain> <pin-set> <pin digest="SHA-256">wLgBEAGmLltnXbK6pzpvPMeOCTKZ0QwrWGem6DkNf6o</pin> <!-备份密钥,比如infinisign.com的中级机构是geotrust --> <pin digest="SHA-256">wLgBEAGmLltnXbK6pzpvPMeOCTKZ0QwrWGem6DkNf6o</pin> </pin-set> </domain-config> </network-security-config>
2、引入配置文件:
在AndroidManifest.xml
中引入上述配置文件:
<application android:networkSecurityConfig="@xml/network_security_config"> <!-application 其它子元素 --> </application>
三、OkHttp证书锁定
OkHttp是一个用于Android处理网络请求的开源项目,是安卓端最流行的轻量级网络框架,通过OkHttp,开发者可以实现更灵活的证书锁定机制。
OkHttpClient client = new OkHttpClient.Builder() .certificatePinner(new CertificatePinner.Builder() .add("infinisign.com", "sha256/S8Ff3JCaO4V...") .build()) .build();
需要注意的是,OkHttp证书锁定方式不适用于公钥锁定方式,必须以证书锁定方式内置SSL数字证书。
四、TrustManager锁定
TrustManager是一个比较老的证书锁定方法,主要用于早期的Android版本或者用于一些CA根机构在Android系统中缺失根证书的情形下,由于其存在被绕过的风险,通常不建议使用。
五、自签名证书的使用
在某些场景下,如公司内部使用或测试环境,可能需要使用自签名证书,以下是自签名证书在Android中的使用方法:
1、生成自签名证书:
使用JDK自带的keytool
工具生成自签名证书。
keytool -genkey -alias my_server -keyalg RSA -keystore my_server.jks -validity 3600 -storepass 123456
2、导出证书:
从密钥库中导出证书。
keytool -export -alias my_server -file my_server.cer -keystore my_server.jks -storepass 123456
3、在代码中使用自签名证书:
将导出的证书放入assets文件夹中,并在代码中加载该证书。
KeyStore trustStore; try { String keyStoreType = KeyStore.getDefaultType(); trustStore = KeyStore.getInstance(keyStoreType); trustStore.load(null, null); // 加载自签名证书到KeyStore中 InputStream certificate = getResources().openRawResource(R.raw.my_server_cert); CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); X509Certificate ca = (X509Certificate) certificateFactory.generateCertificate(certificate); trustStore.setCertificateEntry("ca", ca); // 初始化TrustManagerFactory TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(trustStore); // 创建SSLContext并绑定TrustManager SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, trustManagerFactory.getTrustManagers(), null); } catch (Exception e) { e.printStackTrace(); }
相关问题与解答
1、如何在Android中信任所有证书?
虽然可以通过实现X509TrustManager
接口来信任所有证书,但这种方法并不推荐,因为它会降低应用的安全性,如果确实需要这样做,可以参考以下代码:
TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public X509Certificate[] getAcceptedIssuers() { return null; } } }; try { SSLContext sc = SSLContext.getInstance("TLS"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); } catch (Exception e) { }
2、如何在Android中使用自签名证书进行HTTPS请求?
使用自签名证书进行HTTPS请求时,需要先将证书添加到系统的受信任证书存储区或在代码中手动信任该证书,具体步骤包括生成自签名证书、将证书导入到设备或模拟器中的信任存储区,然后在代码中使用该证书创建SSL上下文并发起HTTPS请求。
各位小伙伴们,我刚刚为大家分享了有关“android端ssl证书”的知识,希望对你们有所帮助。如果您还有其他相关问题需要解决,欢迎随时提出哦!
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/638175.html