Android使用HTTPS进行IP直连握手失败问题(okHttp)

  为什么要使用ip直连这种方式去请求我们的服务器呢?这其实和国内运营伤有关,运营商有时为了利益会将你的域名劫持换成他人的域名,为了防止这种情况的发生通用的解决办法要么联系运营商要么就只能使用ip直连了。普遍大家目前使用的都是okHttp,这里就以okHttp为例子。其实非常简单只需要设置一下两个方法就行:

        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        ....
        String domain = ....;
        builder.sslSocketFactory(new TlsSniSocketFactory(domain), new SSLUtil.TrustAllManager())
                .hostnameVerifier(new TrueHostnameVerifier(domain));

通过调用sslSocketFactory()方法传入两个参数一个是:SSLSocket,还有一个x509TrustManager。我们来看看第一个参数是如何实现的:

public class TlsSniSocketFactory extends SSLSocketFactory {
    private final String TAG = TlsSniSocketFactory.class.getSimpleName();
    HostnameVerifier hostnameVerifier = HttpsURLConnection.getDefaultHostnameVerifier();
    String peerHost;

    public TlsSniSocketFactory(String peerHost) {
        this.peerHost = peerHost;
    }

    public TlsSniSocketFactory() {
    }

    @Override
    public Socket createSocket() {
        return null;
    }

    @Override
    public Socket createSocket(String host, int port) {
        return null;
    }

    @Override
    public Socket createSocket(String host, int port, InetAddress localHost, int localPort) {
        return null;
    }

    @Override
    public Socket createSocket(InetAddress host, int port) {
        return null;
    }

    @Override
    public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) {
        return null;
    }

    // TLS layer
    @Override
    public String[] getDefaultCipherSuites() {
        return new String[0];
    }

    @Override
    public String[] getSupportedCipherSuites() {
        return new String[0];
    }

    @Override
    public Socket createSocket(Socket plainSocket, String host, int port, boolean autoClose) throws IOException {
        if (TextUtils.isEmpty(peerHost)) {
            peerHost = host;
            peerHost =  ....;
        }        Log.i(TAG, "customized createSocket. host: " + peerHost);
        InetAddress address = plainSocket.getInetAddress();
        if (autoClose) {
            // we don't need the plainSocket
            plainSocket.close();
        }
        // create and connect SSL socket, but don't do hostname/certificate verification yet
        SSLCertificateSocketFactory sslSocketFactory = (SSLCertificateSocketFactory) SSLCertificateSocketFactory.getDefault(0);
        SSLSocket ssl = (SSLSocket) sslSocketFactory.createSocket(address, port);
        // enable TLSv1.1/1.2 if available
        ssl.setEnabledProtocols(ssl.getSupportedProtocols());
        // set up SNI before the handshake
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            Log.i(TAG, "Setting SNI hostname");
            sslSocketFactory.setHostname(ssl, peerHost);
        } else {
            Log.d(TAG, "No documented SNI support on Android <4.2, trying with reflection");
            try {
                java.lang.reflect.Method setHostnameMethod = ssl.getClass().getMethod("setHostname", String.class);
                setHostnameMethod.invoke(ssl, peerHost);
            } catch (Exception e) {
                Log.w(TAG, "SNI not useable", e);
            }
        }
        // verify hostname and certificate
        SSLSession session = ssl.getSession();
        if (!hostnameVerifier.verify(peerHost, session))
            throw new SSLPeerUnverifiedException("Cannot verify hostname: " + peerHost);
        Log.i(TAG, "Established " + session.getProtocol() + " connection with " + session.getPeerHost() +
                " using " + session.getCipherSuite());
        return ssl;
    }
}

为了防止获取不到domain将外围的domain塞入,将这个domain塞入返回我们的ssl。x509TrustManagerx信任了所有的证书,当然正常情况下应该使用和后端约定好的证书,代码如下:

public class SSLUtil {
    /**
     * 默认信任所有的证书
     * TODO 最好加上证书认证,主流App都有自己的证书
     *
     * @return
     */
    @SuppressLint("TrulyRandom")
    public static SSLSocketFactory createSSLSocketFactory() {

        SSLSocketFactory sSLSocketFactory = null;

        try {
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, new TrustManager[]{new TrustAllManager()},
                    new SecureRandom());
            sSLSocketFactory = sc.getSocketFactory();
        } catch (Exception e) {
        }

        return sSLSocketFactory;
    }

    public static class TrustAllManager implements X509TrustManager {

        @Override
        public void checkServerTrusted(X509Certificate[] chain, String authType)

        {
        }

        @Override
        public void checkClientTrusted(X509Certificate[] chain, String authType) {

        }

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




    public static class TrustAllHostnameVerifier implements HostnameVerifier {
        @Override
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    }
}

最后https需要校验我的domain是否是服务器提供的domain:

public class TrueHostnameVerifier implements HostnameVerifier {
    public  String domain;

    public TrueHostnameVerifier(String domain) {
        this.domain = domain;
    }
    public TrueHostnameVerifier() {
    }

    @Override
    public boolean verify(String hostname, SSLSession session) {
        if(TextUtils.isEmpty(domain)) {
            domain = ...;
        }
        return HttpsURLConnection.getDefaultHostnameVerifier().verify(domain, session);
    }
}

以上代码可以直接拷贝,省略号代码具体代码可能需要你自己去实现。希望对你有所帮助。

转载于:https://www.cnblogs.com/lovelyYakir/p/10701618.html

Android开发实战:HTTPS证书验证问题全解析与OkHttp解决方案 HTTPS作为现代网络通信的安全基石,其核心机制依赖于SSL/TLS协议对服务器身份的验证。该协议通过数字证书体系建立信任链,确保数据传输的机密性与完整性。在工程实践中,Android应用常因自签名证书、证书过期或域名不匹配等问题触发验证失败,导致网络请求中断。理解证书验证原理,掌握如何在确保安全的前提下处理各类证书异常,是提升应用兼容性与稳定性的关键技术。本文聚焦Android平台,针对开发测试与生产环境中常见的证书信任问题,提供了基于OkHttp的实战解决方案,涵盖特定证书信任、安全配置及深度排查指南, 阅读详情

相关推荐

使用Frida绕过安卓HTTPS证书绑定实现安全抓包

HTTPS协议通过TLS/SSL加密保障网络通信安全,其核心机制包括证书验证与密钥交换。在移动应用安全测试与逆向工程中,分析加密流量是理解应用行为的关键。然而,证书绑定技术会阻止代理工具解密HTTPS流量。动态代码插桩技术允许在应用运行时修改其逻辑,通过Hook关键验证函数绕过安全校验。本文结合Frida框架,针对X509TrustManager和HostnameVerifier等组件,提供通用Hook脚本实现流量捕获,适用于安全研究、接口测试等场景,有效解决证书绑定导致的抓包难题。

weixin_30564901的博客 479

Android Https相关完全解析 当OkHttp遇到Https

转自: http://blog.youkuaiyun.com/lmj623565791/article/details/48129405; 本文出自:【张鸿洋的博客】 一、概述 其实这篇文章理论上不限于okhttp去访问自签名的网站,不过接上篇博文了,就叫这个了。首先要了解的事,okhttp默认情况下是支持https协议的网站的,比如https://www.baidu.com,https://...

iteye_7202的博客 2720

OKHttp HTTPS证书验证实战:从Hostname错误到安全解决方案

HTTPS作为HTTP的安全传输层,其核心在于通过SSL/TLS协议建立加密通道,而证书验证是确保通信双方身份可信的关键环节。其工作原理涉及非对称加密、数字签名和公钥基础设施(PKI),客户端会验证服务器证书的合法性、有效期及主机名匹配。这一机制的技术价值在于防止中间人攻击,保障数据传输的机密性与完整性,广泛应用于金融支付、API接口调用及内部微服务通信等场景。当遇到自签名证书或内网IP直连时,常触发`SSLPeerUnverifiedException`等主机名验证错误。本文聚焦**OKHttp**这一主

weixin_32050773的博客 237

Android 当使用http2时okhttp2 v3.4版本网络连接超时分析

最近遇到了一个奇葩的问题,有个别用户反馈App上的菊花一直在转消失不掉,当时产生了几个猜想: 1、dns解析出问题了 2、服务端有问题 3、哪里超时了 4、哪里死循环了 一开始以为是偶然,结果短短一天内,有好几个用户反馈有这个问题,所以这绝对不是偶然,一定是有一个条件触发了这个bug。 由于我们自己调度了dns,所以一开始我们以为是httpdns的问题,但是通过简单的日志分析,发现其实并...

VIPqiangqiang的专栏 3447

Android-网络优化,使用-HTTPDNS-优化-DNS,从原理到-OkHttp-集成

DNS 不仅支持 UDP,它还支持 TCP,但是大部分标准的 DNS 都是基于 UDP 与 DNS 服务器的 53 端口进行交互。 HTTPDNS 则不同,顾名思义它是利用 HTTP 协议与 DNS 服务器的 80 端口进行交互。不走传统的 DNS 解析,从而绕过运营商的 LocalDNS 服务器,有效的防止了域名劫持,提高域名解析的效率。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rBUL60OF-1651972368818)(//upload-images.jians

m0_70083062的博客 984

傅里叶变换实战:用Python手把手教你分析音频频谱(附完整代码)

本文详细介绍了如何使用Python实现傅里叶变换进行音频频谱分析,涵盖音频加载、预处理、FFT应用、频谱可视化及特征提取等关键步骤。通过实战案例和完整代码,帮助开发者掌握数字信号处理技术,特别适合音频分析和音乐信息检索领域的应用。

weixin_29090677的博客 150

OkHttp java.net.SocketTimeoutException: SSL handshake timed out in Android

做项目遇到以下问题 当请求Https时出现ssl握手超时, 了解到这是因为在Android 4.4.1以后,也就是API20+以后默认打开TLS 1.2 而再此之前的TLS是默认关闭的 解决方式1 TLSSocketFactory 继承SSLSocketFactory ,然后通过okHttp 的conn…SSLSocketFactory 这个方法进行设置;public class TLSS

Oblivion的博客 3万+

【RF】Receiver Function接收函数:从理论到实践的深度解析

本文深入解析地震学中的接收函数(Receiver Function, RF)技术,从理论原理到实践操作。文章将RF比作地球的“听诊器”,详细阐述了其通过反褶积剥离震源影响、揭示地下结构(如莫霍面)的核心机制,并提供了使用Python和rf库进行数据处理、计算、动校正与叠加的完整实战流程,同时探讨了其应用、局限性与常见问题的解决方案。

Jerry的专栏 121

对于httpclient在android5.0及以下的系统中,访问多证书的服务器时出现hostname验证不过

现象:对于现在服务器部署的域名可多个后,在使用https协议时,会部署多个ssl证书链,而在android5.0及以下的系统使用httpclient访问这类某个域名时,有时候会出现hostname校验不过的情况,报的错误是 Certificate for doesn't match common name of the certificate subject:   cn host:是要访

happy668ha的博客 3437

解决mmdet3d安装中因PyTorch高版本引发的THC.h缺失问题

本文详细分析了在安装mmdet3d时,因PyTorch版本过高导致THC.h头文件缺失的常见报错问题。文章指出该错误的本质是PyTorch 1.7+版本废弃了旧API,与老版本C++扩展代码不兼容。提供了两种核心解决方案:一是降级PyTorch至1.6及以下版本;二是修改源码,将THC.h引用替换为ATen/cuda等新头文件,并给出了具体的代码修改示例和排查技巧。

weixin_29085151的博客 379

ComfyUI工作流换脸节点报错ReActorFaceSwap

找到自己ComfyUI安装目录的custom_nodes下是否有这个comfyui-reactor-node-main。大家在借鉴别人工作流进行AI换脸的时候,如果遇到ReActorFaceSwap报错提示,莫慌,看我的,两步解决问题。这里千万注意不要嵌套文件夹,保证点击去这个文件就可以看到内置的配置文件!找到自己ComfyUI安装目录的facerestore_models。如果有这个文件,直接跳过,去下一步。如果没有,可以去Git官网下载。

qq_70810809的博客 9015

Okhttp 接入HttpDNS(支持http/https,)达到IP直连

HttpDns 是什么? HTTPDNS 利用 HTTP 协议与 DNS 服务器交互,代替了传统的基于 UDP 协议的 DNS 交互,绕开了运营商的 Local DNS,有效防止了域名劫持,提高域名解析效率。 链接:HttpDns 原理是什么 简单理解,就是客户端把HTTP请求的域名发送到HttpDns服务商,HttpDns会把解析的IP地址传回客户端,来达到绕开运营商的 Local DNS,有效...

K_Hello的博客 8083

储能EMS工作原理深度剖析:功率分配与充放电策略的底层逻辑

储能EMS的功率分配与充放电策略,是其智能化的集中体现。功率分配更像一个“执行指挥官”,关注如何将总任务高效、公平、安全地分解到每个士兵(PCS/电池簇);而充放电策略则像“总参谋长”,基于战场情报(市场、电网、自身状态)制定最优的作战计划。AI强化学习策略:让EMS通过与复杂环境不断交互,自主学习最优策略,适应不确定性。数字孪生与仿真:在虚拟空间中提前验证策略,评估风险,实现预防性控制。跨站协同优化:多个储能站的EMS通过云平台协同,参与区域电网甚至跨省市场的联合优化调度。

小帽子的博客 375

android ip直连,Android使用HTTPS进行IP直连握手失败问题(okHttp)

public class TlsSniSocketFactory extendsSSLSocketFactory {private final String TAG = TlsSniSocketFactory.class.getSimpleName();HostnameVerifier hostnameVerifier=HttpsURLConnection.getDefaultHostnameVe...

weixin_39872624的博客 527

RK3566/RK3568 Android 11添加系统服务

【代码】RK3566/RK3568 Android 11添加系统服务。

qq_23921815的博客 641

Open3D——平面点云凸多边形轮廓提取【2025最新版】

平面点云凸多边形轮廓提起,博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 6753

Android 网络优化,使用 HTTPDNS 优化 DNS,从原理到 OkHttp 集成

(一)调整好心态心态是一个人能否成功的关键,如果不调整好自己的心态,是很难静下心来学习的,尤其是现在这么浮躁的社会,大部分的程序员的现状就是三点一线,感觉很累,一些大龄的程序员更多的会感到焦虑,而且随着年龄的增长,这种焦虑感会越来越强烈,那么唯一的解决办法就是调整好自己的心态,要做到自信、年轻、勤奋。这样的调整,一方面对自己学习有帮助,另一方面让自己应对面试更从容,更顺利。(二)时间挤一挤,制定好计划一旦下定决心要提升自己,那么再忙的情况下也要每天挤一挤时间,切记不可“两天打渔三天晒网”。

D1561691的博客 809

Claude Code 错误解决方案: Request Timed Out 超时 原因、配置与解决方案

Claude Code 抛出 Request Timed Out 不仅可 能是网络问题,更大概率是 API 高负载或超大响应导致。本文从 默认超时机制出发,拆解三种根因场景,给出 API_TIMEOUT_MS 环境变量调优与任务拆分策略,帮助开发者在保证稳定性的同时 避免误判网络故障。

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 899

Android Https与WebView:内网IP直连场景下的证书配置与安全实践

本文详细探讨了Android在内网IP直连场景下HTTPS与WebView的证书配置与安全实践。针对无DNS服务器的内网环境,提供了生成支持IP地址的SSL证书的解决方案,并深入解析了Network Security Config的配置策略、WebView的证书处理兼容性以及安全的证书链验证实现,确保企业内网通信既安全又稳定。

ff678的博客 515

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

使用Fiddler抓HTTP/HTTPS包,Android7.0以后https抓包失败问题

原博客地址:https://www.52pojie.cn/thread-967606-1-1.html 抓包的重要性 网络抓包,是Android应用逆向分析的重中之重,很多时候我们拿到一个APP,不知道从何入手分析,往往是从抓包开始,先弄清楚他与服务器通信的内容,如果一目了然,我们完全可以照搬,自行写一个程序来模拟,如果有一些加密字段和随机字段,也不用担心,我们可以从抓包中了解到...

iblue007的博客 3901

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android HTTPS双向认证实战:OkHttp+Retrofit+RxJava实现与安全配置

HTTPS作为保障网络通信安全的基础协议,通过SSL/TLS协议层实现数据加密与身份认证。其核心原理在于非对称加密与证书体系,服务器通过数字证书向客户端证明身份,建立加密信道。双向认证(mTLS)在此基础上进一步要求客户端也提供证书,实现双方身份互验,为金融交易、物联网设备管理等高安全场景提供通信保障。在Android开发中,OkHttp作为底层网络引擎,通过自定义SSLSocketFactory和X509TrustManager支持证书加载与验证逻辑;Retrofit负责API层封装,使安全配置透明化;R

weixin_33901926的博客 339

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【安卓面试】网络基础及Android网络框架学习笔记

Android面试必备!包含基础知识和三方框架的整理概括!可当做面试复习索引

weixin_41802023的博客 2479

Android 网络: Volley+OkHttp+Https

使用 OkHttp 作为传输层的实现. Volley 默认根据 Android 系统版本使用不同的 Http 传输协议实现.  在 Android 3.0 以上 Volley 使用 ApacheHttpStack 作为传输协议, 在2.3 及以下使用HttpURLConnection 作为传输层协议 OkHttp 相较于其它的实现有以下的优点. 支持SPDY,允许连接同一主

qlwm2016的博客 575

Android HTTPS连接失败排查:SSL证书链不完整的原理与解决方案

SSL/TLS协议是保障网络通信安全的基石,其核心机制是通过数字证书验证通信双方的身份。证书链验证是其中的关键环节,它要求服务器在握手时提供从服务器证书到可信根证书的完整信任路径。如果中间证书缺失,客户端将因无法构建完整信任链而拒绝连接,这在Android等严格遵循标准的移动端环境中尤为常见。理解证书链的工作原理,掌握服务端正确配置完整链的方法,对于保障移动应用与后端服务的稳定、安全连接至关重要。本文以典型的Android SSL握手失败为例,深入解析证书链验证机制,并提供从诊断到修复的全流程实践指南,帮助

weixin_34049948的博客 421
上一篇: ReactNative手势解锁(react-native-ok-gesture-password)
下一篇: 一起来学习React-Native之react-navigation基本解析
diebing0439
博客等级 码龄11年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值