首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用okHttp信任所有证书

使用okHttp信任所有证书
EN

Stack Overflow用户
提问于 2014-08-26 15:10:32
回答 6查看 120.6K关注 0票数 134

出于测试目的,我尝试向okHttp客户机添加一个套接字工厂,它在设置代理时信任所有内容。这已经做了很多次了,但我的信任套接字工厂的实现似乎遗漏了一些东西:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class TrustEveryoneManager implements X509TrustManager {
    @Override
    public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { }

    @Override
    public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { }

    @Override
    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
        return null;
    }
}
OkHttpClient client = new OkHttpClient();

final InetAddress ipAddress = InetAddress.getByName("XX.XXX.XXX.XXX"); // some IP
client.setProxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(ipAddress, 8888)));

SSLContext sslContext = SSLContext.getInstance("TLS");
TrustManager[] trustManagers = new TrustManager[]{new TrustEveryoneManager()};
sslContext.init(null, trustManagers, null);
client.setSslSocketFactory(sslContext.getSocketFactory);

我的应用没有发送任何请求,也没有记录任何异常,所以它似乎在okHttp中静默失败。进一步调查发现,当强制握手时,okHttp的Connection.upgradeToTls()中似乎有一个异常被吞噬。我得到的例外是:javax.net.ssl.SSLException: SSL handshake terminated: ssl=0x74b522b0: SSL_ERROR_ZERO_RETURN occurred. You should never see this.

下面的代码生成一个SSLContext,它在创建不抛出任何异常的SSLSocketFactory时非常有用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected SSLContext getTrustingSslContext() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
    final SSLContextBuilder trustingSSLContextBuilder = SSLContexts.custom()
            .loadTrustMaterial(null, new TrustStrategy() {
                @Override
                public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                    return true; // Accepts any ssl cert whether valid or not.
                }
            });
    return trustingSSLContextBuilder.build();
}

问题是,我试图从我的应用程序中完全删除所有Apache HttpClient依赖项。使用Apache HttpClient生成SSLContext的底层代码似乎足够简单,但我显然遗漏了一些东西,因为我无法配置我的SSLContext来匹配它。

有没有人能够在不使用Apache HttpClient的情况下实现我想要的SSLContext实现?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-09-23 10:33:13

为了防止有人在这里出现问题,对我有效的(唯一)解决方案是创建像解释here这样的OkHttpClient

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static OkHttpClient getUnsafeOkHttpClient() {
  try {
    // Create a trust manager that does not validate certificate chains
    final TrustManager[] trustAllCerts = new TrustManager[] {
        new X509TrustManager() {
          @Override
          public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
          }

          @Override
          public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
          }

          @Override
          public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return new java.security.cert.X509Certificate[]{};
          }
        }
    };

    // Install the all-trusting trust manager
    final SSLContext sslContext = SSLContext.getInstance("SSL");
    sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
    // Create an ssl socket factory with our all-trusting manager
    final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

    OkHttpClient.Builder builder = new OkHttpClient.Builder();
    builder.sslSocketFactory(sslSocketFactory, (X509TrustManager)trustAllCerts[0]);
    builder.hostnameVerifier(new HostnameVerifier() {
      @Override
      public boolean verify(String hostname, SSLSession session) {
        return true;
      }
    });

    OkHttpClient okHttpClient = builder.build();
    return okHttpClient;
  } catch (Exception e) {
    throw new RuntimeException(e);
  }
}
票数 284
EN

Stack Overflow用户

发布于 2019-12-13 12:34:59

我为Kotlin做了一个扩展函数。将其粘贴到您喜欢的任何位置,并在创建OkHttpClient时导入它。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fun OkHttpClient.Builder.ignoreAllSSLErrors(): OkHttpClient.Builder {
    val naiveTrustManager = object : X509TrustManager {
        override fun getAcceptedIssuers(): Array<X509Certificate> = arrayOf()
        override fun checkClientTrusted(certs: Array<X509Certificate>, authType: String) = Unit
        override fun checkServerTrusted(certs: Array<X509Certificate>, authType: String) = Unit
    }

    val insecureSocketFactory = SSLContext.getInstance("TLSv1.2").apply {
        val trustAllCerts = arrayOf<TrustManager>(naiveTrustManager)
        init(null, trustAllCerts, SecureRandom())
    }.socketFactory

    sslSocketFactory(insecureSocketFactory, naiveTrustManager)
    hostnameVerifier(HostnameVerifier { _, _ -> true })
    return this
}

像这样使用它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
val okHttpClient = OkHttpClient.Builder().apply {
    // ...
    if (BuildConfig.DEBUG) //if it is a debug build ignore ssl errors
        ignoreAllSSLErrors()
    //...
}.build()
票数 26
EN

Stack Overflow用户

发布于 2019-05-17 22:39:37

这是sonxurxo在Kotlin的解决方案,如果有人需要的话。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private fun getUnsafeOkHttpClient(): OkHttpClient {
    // Create a trust manager that does not validate certificate chains
    val trustAllCerts = arrayOf<TrustManager>(object : X509TrustManager {
        override fun checkClientTrusted(chain: Array<out X509Certificate>?, authType: String?) {
        }

        override fun checkServerTrusted(chain: Array<out X509Certificate>?, authType: String?) {
        }

        override fun getAcceptedIssuers() = arrayOf<X509Certificate>()
    })

    // Install the all-trusting trust manager
    val sslContext = SSLContext.getInstance("SSL")
    sslContext.init(null, trustAllCerts, java.security.SecureRandom())
    // Create an ssl socket factory with our all-trusting manager
    val sslSocketFactory = sslContext.socketFactory

    return OkHttpClient.Builder()
        .sslSocketFactory(sslSocketFactory, trustAllCerts[0] as X509TrustManager)
        .hostnameVerifier { _, _ -> true }.build()
}
票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25509296

复制
相关文章
OkHttp忽略SSL证书验证
自签的SSL证书不受信任,可通过将该证书添加至JDK密钥库,jdk信任自签证书,如果这种方法行不通,可尝试该方式
itze
2022/10/31
3.1K0
JDK信任自签证书
找到cacerts文件所在目录路径,jdk_home(jdk位置路径)/jdk1.8.0_231/jre/lib/security 如果是window系统斜杠是“\”到cacerts文件所在路径位置,Linux就cd到此位置,Windows就cmd到此位置
itze
2022/10/31
1.2K0
JDK信任自签证书
使用mkcert工具生成受信任的本地SSL证书
官方文档:https://github.com/FiloSottile/mkcert#mkcert
宝耶需努力
2022/12/13
4.8K0
使用mkcert工具生成受信任的本地SSL证书
解决iOS 证书不受信任的问题
重新下载AppleWWDRCA并安装。即下载最新的AppleWWDRCA证书,双击安装到“登录”项的钥匙串下;然后再安装你的开发证书或者发布证书就可以了。
特特
2022/03/18
8.3K0
已处理证书链,但是在不受信任提供程序信任的根证书中终止
win7 或以下系统没有 证书管理机构, 用下面方法彻底可以解决 证书不认问题 https://social.technet.microsoft.com/Forums/windowsserve
庞小明
2018/03/09
6.1K0
http请求的方法里怎么设置信任所有ssl证书?(PKIX path building failed)
工作中,有时候需要跨系统调用。这个时候HttpURLConnection,而现在很多网站都是用的是HTTPS。我们知道HTTPS都是有证书的。证书有的是花钱买的,有的没有花钱。这请情况下,有时候,有些https请求,就不是可信任的。
凯哥Java
2019/06/28
2K0
http请求的方法里怎么设置信任所有ssl证书?(PKIX path building failed)
OKHttp使用解析
OKHttp 是一套处理 HTTP 网络请求的依赖库,由 Square 公司设计研发并开源,目前可以在 Java 和 Kotlin 中使用,现在几乎已经占据了所有的网络请求操作。
摸鱼的G
2023/02/22
5140
OkHttp简单使用
OkHttp是一个优秀的网络请求框架,目前主流已经替换httpclient, HttpURLConnection 使用方式;
知识浅谈
2021/10/19
4530
OkHttp使用详解
_当然在开始之前,我们还要先在项目中添加OkHttp的依赖库,至于怎么在AndroidStudio中给项目添加OkHTTP依赖,这里将不再赘述。另外,OkHttp中使用了建造者模式,如果对建造者模式不了解,可以看看这篇博客设计模式之建造者模式_**
做个快乐的码农
2021/12/03
11.8K0
OkHttp使用详解
OkHttp 使用示例
可以用来下载文件,打印header,打印body。string()方法对于小文档的响应来说是个既方便又高效的方法。但是如果一个文档太大(大于1M),就不要使用string()方法了,因为这个方法会把整个文档加载到内存中,在这种情况下可以把body当作流来处理。
代码拾遗
2018/07/24
2.8K0
Tip | OkHttp使用
另外注意OkHttp可以把最后执行的execute()方法换成enqueue(callback), 即调用enqueue()并接收一个框架提供的okhttp3.Callback接口;
凌川江雪
2019/06/11
8020
5大导致"SSL证书不被信任"的原因
前言 今天在这里主要总结一下使用SSL的过程中遇到的坑(注意事项)。SSL是什么东西?(请自行搜索) 我(叫龙君)接触SSL证书已经4年了,算上今年,最开始我认为SSL证书就是拿回来安装上就可以使用的。后来发现其实不然,我们还需要去了解SSL证书信任过程和什么是信任证书链。因为大部分客户都不了解这些,购买了证书后安装使用都会出现”不信任”的问题。下面就是总结常见的5中导致SSL证书不信任的原因。 1.SSL证书不是来自公认的证书颁发机构(CA) 我们但凡了解过SSL证书的朋友都明白,我们自己就可以给自己颁发
小小科
2018/05/03
3.8K0
okhttp的使用介绍
4.2.0:要求 Android 5.0+ (API level 21+) and on Java 8+。
103style
2022/12/19
5230
【OkHttp】OkHttp 源码分析 ( OkHttpClient.Builder 构造器源码分析 )
【OkHttp】OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) 【OkHttp】Android 项目导入 OkHttp ( 配置依赖 | 配置 networkSecurityConfig | 配置 ViewBinding | 代码示例 ) 【OkHttp】OkHttp Get 和 Post 请求 ( 同步 Get 请求 | 异步 Get 请求 | 同步 Post 请求 | 异步 Post 请求 ) 【OkHttp】OkHttp 上传图片 ( 获取 SD 卡动态权限 | 跳转到相册界面选择图片 | 使用 OkHttp 上传图片文件 )
韩曙亮
2023/03/29
8700
okhttp 使用笔记
okhttp是一个网络请求框架,也是目前市面上使用最多的网络框架之一。 之前参与的项目一直没使用,这次刚好有个机会使用OKHttp,记录下。
艳龙
2021/12/16
5170
0x800b0109 - 已处理证书链,但是在不受信任提供程序信任的根证书中终止。
有时在安装程序时无法安装出现错误,或者在更新某些系统组件时也遇到同样的错误:“已处理证书链,但是在不受信任提供程序信任的根证书中终止。”。
walterlv
2023/10/23
9.2K0
0x800b0109 - 已处理证书链,但是在不受信任提供程序信任的根证书中终止。
移动客户端的证书、策略、信任评估体系
安全体系一直都是公司需要完成基础设施的支撑。安全包括了数据安全、通信安全、操作安全、代码安全等功能。有的组织则提供了一套标准的安全规范和技术标准比如PKI。而操作系统层面则苹果公司通过其提供的Security.framework而android则通过com.java.security框架来提供安全的支撑。
欧阳大哥2013
2018/08/22
8190
OkHttp基础概念解释
最近在整理Android常用第三方框架相关的东西,说道Android的框架,无外乎就是Android开发中常见的网络、图片缓存、数据交互、优化、页面等框架,其中网络作为一个基础部分,我相信大家更多的是使用OkHttp,而在长连接中有Socket和webSocket等,今天给大家总结下OkHttp相关的内容,部分参考网络资源。
xiangzhihong
2020/01/14
2.1K0
OkHttp基础概念解释
点击加载更多

相似问题

OkHttp信任证书

112

使用okhttp实现对所有证书的信任

10

如何向OkHttp添加受信任的证书

14

在Kotlin中使用okhttp信任HTTPS证书时出错

20

OkHttp中的证书信任/白名单(未找到证书路径的信任锚)

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文