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

使用okHttp信任所有证书
EN

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

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

代码语言:javascript
运行
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
运行
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
运行
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
运行
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
运行
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
运行
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

复制
相关文章
java pfx 证书_Java将pfx证书转换为jks[通俗易懂]
packagecom.yangangus.util;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.security.Key;importjava.security.KeyStore;importjava.security.cert.Certificate;importjava.util.Enumeration;public classConventPFXToJKS {public static final String PKCS12 = “PKCS12”;public static final String JKS = “JKS”;public static final String PFX_KEYSTORE_FILE = “D:\\temp\\certs\\wildcard_test_com.pfx”;//pfx文件位置
全栈程序员站长
2022/09/08
1K0
jks证书转pem证书
用管理员权限打开一个cmd框,找到jdk的bin目录,然后执行如下命令:(请自行将jks文件拷贝至此)
华创信息技术
2019/12/18
6.6K0
pfx 证书 转 jks 证书
今天在tomcat 配置 https pfx 证书时 总是配置失败 很是 头疼 ,配置参数如下:
全栈程序员站长
2022/09/06
2.6K0
pfx 证书 转 jks 证书
https证书crt转pem
今天网站的证书快要过期了,但是下载下来发现原来的public.pem和chain.pem证书变成了.crt证书。配置老是出现错误,想着能不能将crt转换成pem。
逍遥子大表哥
2021/12/17
3.8K0
[OpenSSL] 微信支付证书pfx分解成pem
事件起因:做香港本地微信支付(香港公司收取香港用户钱包)申请的商户只提供了cert.pem和一个pfx的文件。程序使用pem需要cert和key两个文件,所以需要从pfx文件中提取cert和key文件。
宣言言言
2019/12/19
2.2K0
导入pfx证书
本文分享从Micrsoft Manange Console(简写为 MMC)中导入PFX证书的内容,您可以按住“Windows + R”,从Run对话框中输入mmc,打开MMC界面。
全栈程序员站长
2022/06/26
2.5K0
导入pfx证书
制作PFX证书
C:\Users\wood>openssl genrsa -des3 -out root.key Generating RSA private key, 2048 bit long modulus …………………………………………………………….+++ .+++ e is 65537 (0x10001) Enter pass phrase for root.key: Verifying – Enter pass phrase for root.key:
全栈程序员站长
2022/06/26
1.2K0
pfx证书解析
openssl pkcs12 -in test.pfx -nodes -out server.pem
全栈程序员站长
2022/08/15
1.2K0
java pfx 证书_java 证书 .cer 和 .pfx[通俗易懂]
由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形式,以pfx作为证书文件后缀名。
全栈程序员站长
2022/09/01
2K0
关于pfx证书和cer证书
PFX也称为PKCS#12(Public Key Cryptography Standards #12,公钥密码技术标准#12),包含KEY文件(RSA PRIVATE KEY,RSA私钥) + CRT文件(CERTIFICATE,证书)。常见的扩展名是: .pfx 和 .p12
全栈程序员站长
2022/08/15
9.2K0
关于pfx证书和cer证书
OpenSSL 转换证书格式
工作中我相信你一定会遇到处理数字证书的时候。各种平台,各种语言,它们采用的证书格式与标准都不相同,多多少少存在一些差异。实际上证书仍然是那个证书,只是格式发生了变化。 公私钥 分开存储 公私钥合并为一个文件 有些采用二进制文件 有些事二进制文件做了BASE64编码 有些证书做了签名 有些证书加入了密码 不同组织有不同的编码。例如微软喜欢使用 x509 下面内容节节选自《Netkiller Cryptography 手札》 接下来几天我们将讨论密钥证书相关话题。 文章出处: http://www.netk
netkiller old
2018/03/05
4.2K0
openssl 创建 pfx 证书
生成证书请求文件,需要填写信息,例如:cn/gd/zh/sourcecode/bdc/www.a.com
全栈程序员站长
2022/08/15
8860
java生成pfx证书[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。package com.zrsf.cert;
全栈程序员站长
2022/09/06
1.2K0
将pem证书转换成p12格式证书
.cer是苹果的默认证书,在xcode开发打包可以使用,如果在lbuilder、phonegap、HBuilder、APICloud这些跨平台开发工具打包,就需要用到p12文件。
西门呀在吹雪
2022/12/29
3.2K0
tomcat 配置pfx证书
<Connector port=”80″ protocol=”HTTP/1.1″ connectionTimeout=”20000″ redirectPort=”443″ URIEncoding=”UTF-8″ />
全栈程序员站长
2022/08/22
1.4K0
快速配置Let's encrypt通配符证书
利用certbot工具配置Let’s encrypt通配符证书,所域名下所有的子域名都能方便的使用 https证书,而且完全免费。值得关注的是,Let’s encrypt通配符证书只是针对二级域名,并不能针对主域名,如*.hubinqiang.com和hubinqiang.com 被认为是两个域名,如果和我一样使用的是主域名,在申请的时候需要注意都要申请。
OwenZhang
2021/12/08
2K0
快速配置Let's encrypt通配符证书
.pfx证书 .cer证书MD5withRSA加密
前言:最近接了一个支付平台,提供了.pfx私钥文件以及.cer公钥文件,对于不常用的加密技术的人来说一头雾水。
王念博客
2019/07/25
1.5K0
安卓SSL证书格式:pfx转换BKS格式证书
  实际上在Android中是无法使用pfx格式证书,Android 系统中使用的证书要求是bks格式。要转换bks证书格式,首先要搭建转换证书的环境。
合信ssl证书
2019/07/09
2.7K0
pfx证书生成「建议收藏」
第一步:打开linux 创建一个文件夹 第二步:openssl req -newkey rsa:2048 -nodes -keyout 0.key -x509 -days 365 -out youfilename.cer 根据提示输入国家代码,省,城市,组织,单位,名称,邮箱 第三步:openssl pkcs12 -export -in youfilename.cer -inkey 0.key -out youfilename.pfx 根据提示输入密码两次,*使用的时候会提示输入密码
全栈程序员站长
2022/06/26
1.6K0
java pfx_如何在Java处理PFX格式证书
公钥加密技术12号标准(Public Key Cryptography Standards #12,PKCS#12)为存储和传输用户或服务器私钥、公钥和证书指定了一个可移植的格式。它是一种二进制格式,这些文件也称为PFX文件。
全栈程序员站长
2022/08/14
1.8K0

相似问题

分割字符串但忽略带引号的分隔符的regexp

01

标记字符串,但忽略引号中的分隔符

130

拆分字符串,忽略引号内的分隔符(python)

60

忽略双引号中的分隔符

45

忽略引号CsvHelper中的分隔符

111
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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