基于OkHttp访问网络时出现的网站证书认证问题

本文介绍了一种解决Android应用中因网站证书认证问题导致的HTTPS访问失败的方法。通过创建一个不验证证书的OkHttpClient实例,实现了对所有网站证书的信任,从而避免了javax.net.ssl.SSLHandshakeException等错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 最近在跟后台交互的时候发现,后台基于安全考虑使用了https的通信。但是当安卓端使用OkHttp框架像平时一般请求访

问网络时则会出现如下错误:

 javax.net.ssl.SSLHandshakeException:
  java.security.cert.CertPathValidatorException: 
  Trust anchor for certification path not found. 
查阅了很多资料后我才发现,这是网站证书的认证存在安全问题。在看了很多代码之后,我将其汇总在一个HttpUtils工具类中,以方便使用。
具体解决方法如下:
public static OkHttpClient getUnsafeOkHttpClient() throws NoSuchAlgorithmException,
            KeyManagementException {

        try {
            TrustManager[] trustAllCerts = new TrustManager[] {
                    new X509TrustManager() {

                        @Override
                        public void checkClientTrusted(X509Certificate[] x509Certificates, String s)
                                throws CertificateException {

                        }

                        @Override
                        public void checkServerTrusted(X509Certificate[] x509Certificates, String s)
                                throws CertificateException {

                        }

                        @Override
                        public X509Certificate[] getAcceptedIssuers() {
                            return new X509Certificate[0];
                        }
                    }
            } ;

            final SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustAllCerts, new SecureRandom());
            final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.sslSocketFactory(sslSocketFactory);

            builder.hostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String s, SSLSession sslSession) {
                    return true;
                }
            });
            return builder.build();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }
 这个方法返回了一个OkHttpClient对象,并且为其实现了对所有网站证书安全性的认证,以此对象去访问网络便可以解决上述错误。


### P12证书的使用方法 P12证书是一种基于PKCS#12标准的加密文件,通常用于存储私钥和公钥对以及相关的数字证书。以下是关于如何在Android中使用P12证书的相关说明。 #### Android中加载并使用P12证书 要在Android应用程序中实现通过P12证书的身份验证功能,可以按照以下方式操作: 1. **导入P12证书到KeyStore** 需要先将`.p12`文件转换为Java KeyStore (JKS) 格式或者直接读取其内容作为密钥库的一部分。可以通过以下代码片段完成此过程: ```java import java.io.InputStream; import java.security.KeyStore; public class CertificateLoader { public static void loadCertificate(String password, InputStream inputStream) throws Exception { KeyStore keyStore = KeyStore.getInstance("PKCS12"); keyStore.load(inputStream, password.toCharArray()); System.out.println("Keys loaded successfully from the .p12 file."); } } ``` 上述代码展示了如何从输入流中加载一个`.p12`文件,并将其解码至内存中的密钥仓库实例[^1]。 2. **设置HTTPS连接的信任管理器** 当需要向服务器发送请求,应创建自定义的SSL上下文以便处理客户端认证需求。这一步骤涉及初始化SSLSocketFactory对象并与OkHttp或其他HTTP客户端集成。 ```java import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManagerFactory; // 假设已成功加载keyStore变量 TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(keyStore); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, tmf.getTrustManagers(), null); HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); System.out.println("Custom SSL context configured with client certificate authentication."); ``` 这段脚本解释了怎样利用之前建立起来的关键材料去构建支持双向TLS握手的安全通信信道。 3. **上传P12证书给第三方服务提供商** 如果目标不是自行开发的服务端而是像个推这样的推送通知平台,则只需遵循它们指定的操作指南即可。一般情况下只需要提供经过妥善保护后的`.p12`二进制数据连同相应访问权限所需的密码一起提交上去就可以了[^2]。 4. **检查P12证书的有效期限** 为了确保长期运行的应用程序不会因为突然失效而中断工作,在部署前应当核查所依赖的所有外部资源的状态——包括但不限于这些嵌入式的X.509凭证。OpenSSL工具提供了便捷的方法来做这件事儿: ```bash openssl pkcs12 -in your-certificate.p12 -nokeys -out extracted.crt ``` 执行命令后会提示输入先前设定好的解锁短语;接着就可以借助常规手段查询到期日期啦[^3]! --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值