CertPathValidatorException:找不到证书路径的信任锚 - Retrofit Android

2024-01-28

我正在创建一个 Android 应用程序,它使用https用于与服务器通信。我在用retrofit and OkHttp用于提出请求。这些对于标准来说效果很好http要求。以下是我遵循的步骤。

Step 1 :使用命令从服务器获取证书文件

echo -n | openssl s_client -connect api.****.tk:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > gtux.cert

Step 2 :使用以下命令将证书转换为 BKS 格式

keytool -importcert -v -trustcacerts -file "gtux.cert" -alias imeto_alias -keystore "my_keystore.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "bcprov-jdk16-146.jar" -storetype BKS

它要求我输入密码,文件已成功创建。

Step 3 :

创建一个 OkHttpClient 并使用它来发出 https 请求

public class MySSLTrust {
public static OkHttpClient trustcert(Context context){
    OkHttpClient okHttpClient = new OkHttpClient();
    try {
        KeyStore ksTrust = KeyStore.getInstance("BKS");
        InputStream instream = context.getResources().openRawResource(R.raw.my_keystore);
        ksTrust.load(instream, "secret".toCharArray());
        // TrustManager decides which certificate authorities to use.
        TrustManagerFactory tmf = TrustManagerFactory
                .getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(ksTrust);
        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, tmf.getTrustManagers(), null);
        okHttpClient.setSslSocketFactory(sslContext.getSocketFactory());
    } catch (KeyStoreException | IOException | NoSuchAlgorithmException | CertificateException | KeyManagementException e) {
        e.printStackTrace();
    }
    return okHttpClient;
}
}

Step 4:

必须创建 RestAdapter

RestAdapter.Builder()
.setRequestInterceptor(intercept)
.setEndpoint("https://api.****.tk")
.setClient(new OkClient(this))
.setLogLevel(RestAdapter.LogLevel.FULL)
.setLog(new AndroidLog("RETROFIT"))
.build();

但最后当运行应用程序时它让我失望CertPathValidatorException : Trust anchor for certificate path not found。请帮我解决这个问题。谢谢。

其他失败尝试:尝试在我的 Xperia Z2 中安装证书,它说文件已安装,但当我运行应用程序时,会引发相同的异常。

错误日志这是我执行时得到的错误日志...

错误日志 https://paste.ee/p/5tZP3

粘贴在那里,以便于阅读。


免责声明:这个答案来自Jul 2015和用途Retrofit and OkHttp从那时候开始。
查看这个链接 https://inthecheesefactory.com/blog/retrofit-2.0/en有关 Retrofit v2 的更多信息和this one https://github.com/square/okhttp/wiki/HTTPS#customizing-trusted-certificates对于当前的 OkHttp 方法。

好的,我用它来工作Android 开发者指南 https://developer.android.com/training/articles/security-ssl.html#UnknownCa.

就像OP一样,我正在尝试使用Retrofit and OkHttp连接到启用 SSL 的自签名服务器。

这是使事情正常工作的代码(我已经删除了 try/catch 块):

public static RestAdapter createAdapter(Context context) {
  // loading CAs from an InputStream
  CertificateFactory cf = CertificateFactory.getInstance("X.509");
  InputStream cert = context.getResources().openRawResource(R.raw.my_cert);
  Certificate ca;
  try {
    ca = cf.generateCertificate(cert);
  } finally { cert.close(); }

  // creating a KeyStore containing our trusted CAs
  String keyStoreType = KeyStore.getDefaultType();
  KeyStore keyStore = KeyStore.getInstance(keyStoreType);
  keyStore.load(null, null);
  keyStore.setCertificateEntry("ca", ca);

  // creating a TrustManager that trusts the CAs in our KeyStore
  String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
  TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
  tmf.init(keyStore);

  // creating an SSLSocketFactory that uses our TrustManager
  SSLContext sslContext = SSLContext.getInstance("TLS");
  sslContext.init(null, tmf.getTrustManagers(), null);

  // creating an OkHttpClient that uses our SSLSocketFactory
  OkHttpClient okHttpClient = new OkHttpClient();
  okHttpClient.setSslSocketFactory(sslContext.getSocketFactory());

  // creating a RestAdapter that uses this custom client
  return new RestAdapter.Builder()
              .setEndpoint(UrlRepository.API_BASE)
              .setClient(new OkClient(okHttpClient))
              .build();
}

为了帮助调试,我还添加了.setLogLevel(RestAdapter.LogLevel.FULL)到我的 RestAdapter 创建命令,我可以看到它连接并从服务器获取响应。

所需要的只是我的原创.crt文件保存在main/res/raw. The .crt文件(也称为证书)是使用以下命令创建证书时创建的两个文件之一openssl。一般是.crt或.cert文件,另一种是.key文件。

Afaik,.crt 文件是你的公钥.key 文件是您的私钥。

正如我所看到的,你已经有了一个.cert文件,这是相同的,所以尝试使用它。


PS:对于那些将来读到它并且只有一个.pem文件,根据这个答案 https://stackoverflow.com/a/14484363/4261176,您只需要将一个转换为另一个:

openssl x509 -outform der -in your-cert.pem -out your-cert.crt

PS²:对于那些根本没有任何文件的人,您可以使用以下命令(bash)从任何服务器提取公钥(也称为证书):

echo -n | openssl s_client -connect your.server.com:443 | \
  sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/my_cert.crt

只需更换your.server.com和端口(如果不是标准 HTTPS)并选择要创建的输出文件的有效路径。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CertPathValidatorException:找不到证书路径的信任锚 - Retrofit Android 的相关文章

  • 如何设置日期选择器的日期?

    I use DatePickerDialog OnDateSetListener效果很好 我想在日期选择器中添加 120 天的日期 我的意思是 如果我添加 120 天 日期和月份将自动更改 怎么做 像这样的事情应该可以解决问题 Calend
  • 避免 XferMode 替换画布上的颜色

    我正在尝试替换使用在画布上绘制的内容的颜色避免Xfer模式 http developer android com reference android graphics AvoidXfermode html 从 android 文档来看 它看
  • 通过存储访问框架 (SAF) 启用显示/隐藏 SD 卡的额外功能

    我正在使用存储访问框架 SAF Intent intent new Intent Intent ACTION OPEN DOCUMENT intent addCategory Intent CATEGORY OPENABLE intent
  • OpenGL ES 2.0 中的透明对象

    所以我一直在 Android 上使用 OpenGL ES 2 0 但现在遇到了一个我无法解决的问题 提前道歉 看来我还不能发布两个以上的链接 所以我把我的三张图片放在 Photobucket 相册中 我正在尝试创建一个由透明区域 彩色玻璃
  • 即使成功固定后,ParseQuery 在从本地数据存储查询时也给出 0 个对象

    我正在使用 parse com 的 Android SDK 并且遇到了一个特殊的问题 从片段的 onCreate 中 从服务器获取一个对象 Pin it 从本地数据存储中获取对象 以下是 onCreate 中的代码片段 ParseObjec
  • Recyclerview 中的 view.GONE 仍保留空间

    我在网上搜索了一下 发现 view invisible 和 view gone 之间有区别 vie gone 必须消失而不保留空间 但它不会发生在我身上 我该如何解决它 请帮忙看看这两张图片的链接 Android模拟器上的结果图 https
  • 如何在同一个列表视图中同时实现ontouch和onfling?

    我有一个listview并实现了onclick和onfling 问题是当我进行fling 从左向右滑动 时 listview的onclick事件也被执行 如何克服这个问题 如何区分列表视图中的触摸 点击 和滑动 滑动 listClickLi
  • Android 设备与本地 API 服务器通信

    我想知道如何在外部设备上模拟我的 Android 应用程序 以便与我的计算机上运行的本地 API 服务器进行通信 该应用程序使用 cordova 并使用 USB 连接在 Android 设备上运行 我正在本地运行 API 服务器 使用我的机
  • 使用 android-async-http (loopj) 发布 JSON/XML

    我在用android async http http loopj com android async http 并且真的很喜欢它 我在发布数据时遇到了问题 我必须按照以下格式将数据发布到 API
  • 以编程方式更改小部件布局

    假设我有两个小部件布局 Layout1 和 Layout2 小部件的默认值是 Layout1 但我允许用户选择 他们希望小部件采用哪种布局 所以如果用户更改为 Layout2 如何以编程方式将布局更改为 Layout2 小部件没有像活动那样
  • Android MapView v2 黑屏

    我一直在尝试实现 android 的 MapView v2 除了这个错误之外 我让它工作得很好 This is what it looks like when I load the app from scratch 如您所见 没有任何问题
  • 如何将点击侦听器添加到 Android/Java Textview 中的字符串中?

    我想要完成的是大多数 Twitter 应用程序中的标准操作 在文本视图中 文本字符串中的单词前面可能有 提及或 主题标签 并且它们实际上能够添加点击侦听器这个词启动了另一项活动 有谁知道这是如何实现的 下面我附上了一张示例照片 显示了我想要
  • 无法将图像从 url 存储到 SD 卡

    我想将图像存储在 mnt sdcard 中 package com Downld file frm net import java io BufferedInputStream import java io File import java
  • 如何使用 Android Volley API?

    我正在考虑在我的下一个项目中实现 Android Volley 库 关于 Volley 的 Google IO 演示 http www youtube com watch v yhv8l9F44qo 但是 我还没有找到该库的任何重要的 AP
  • Android AsyncTask 第二次调用时未执行

    我有一个扩展 AsyncTask 的类 public class SendJSONArray2Server extends AsyncTask
  • 当对话框打开时如何处理屏幕方向变化?

    我有一个 Android 应用程序 它已经在处理方向的更改 即有一个android configChanges orientation 在清单和onConfigurationChange 活动中的处理程序切换到适当的布局并准备它 我有一个横
  • 当 SystemUI 在 Android Boot 中加载时

    如何知道系统 UI 何时加载Android启动过程 状态栏和导航栏视图到底绘制在哪里 作为SystemUI是一个特权应用程序 那么它是否在启动器应用程序 主屏幕 启动之前加载 我不知道 欢迎任何建议 下面是一系列简要解释的步骤 希望能够阐明
  • Android 开发:seekbar 倒计时!

    是否有可能 如果是 如何 如何在用户不执行任何操作的情况下从进度 100 变为 1 就像每0 05秒seekbar setProgress 1 因此 如果用户不执行任何操作 搜索栏就会下降 直到达到 1 请回答如何做到这一点 谢谢 clas
  • INSTALL_FAILED_NO_MATCHING_ABIS:无法提取本机库,res = -113设备

    当我在 android 8 0 设备中执行 android 项目时 我收到错误 INSTALL FAILED NO MATCHING ABIS 无法提取本机库 res 113 错误图像 https i stack imgur com 3kb
  • Android ACTION_MOVE阈值

    我正在编写一个应用程序 需要使用手指或最终使用手写笔在屏幕上书写 我有那部分工作 在 ACTION DOWN 时 开始绘制 在 ACTION MOVE 上 添加线段 在 ACTION UP 上 完成该行 问题是 在 ACTION DOWN

随机推荐

  • KLT 在 OpenCV 中如何工作?

    我很好奇 openCV 中 KLT 背后的逻辑 据我所知 OpenCV中发送的用于寻找光流的图像首先被转换为灰度 我很好奇的是 在运行算法时 我们需要一组用于计算的特征 openCV中求光流法有哪些特点 谢谢 光流有两种类型 密与疏 密集查
  • 使用标准的类型错误

    我阅读了文档和一些讨论该包的文章 但我是 Haskell 的新手 不太了解 但我尝试过 以下是我所做的 module Main where LANGUAGE BangPatterns import Control Parallel par
  • 性能计数器类别名称? (C#)

    我正在尝试将性能计数器编程到我的 C 应用程序中 该应用程序启动另一个进程并检查该启动进程的处理器使用情况 据我了解 性能计数器类要求我分配类别名称 计数器名称和进程名称 我可以很容易地获得进程名称 但是互联网上是否有某种列表包含我可以分配
  • Xcode Playground 上的 SwiftUI 和 foreach 问题

    我试图在 SwiftUI 中执行一个简单的代码 但它显示错误 执行被中断 原因 信号 SIGABRT 这是一个代码 struct ContentView View let data 1 100 map Item 0 let columns
  • 如何在 Mac Excel 2011 上创建 Web 查询?

    我正在尝试从工作表上的网站导入数据 但是当我单击从新数据库查询导入数据时 它显示错误 未安装 Microsoft Query 我到处搜索但找不到解决方案 请帮帮我 Mac 上的过程有点不同 在 Finder 中 转到 Application
  • 带边框的材质设计按钮

    我知道如何制作带有颜色填充的材料设计按钮 style style Widget AppCompat Button Colored 还有无边框透明按钮 style style Widget AppCompat Button Borderles
  • Android Studio 中的 Javadoc @link 引用

    我正在尝试使用 Android Studio 生成一些 Javadoc 我指的是 link method 与链接在同一类中的方法 但我仍然得到reference not found来自 Javadoc 的错误 我可能遗漏了一些非常愚蠢的东西
  • MongoDB - 聚合 ObjectId 上的 $match

    我有一个如下所示的架构 var mongoose require mongoose module exports mongoose model Owner username String blocks type mongoose Schem
  • file_get_contents 处理错误的好方法[重复]

    这个问题在这里已经有答案了 我正在尝试错误处理 file get contents 方法 因此即使用户输入了错误的网站 它也会回显错误消息 而不是不专业的信息 警告 file get contents sidiowdiowjdiso 无法打
  • iPhone 应用程序中的文档文件编辑[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有人请建议我如何在 iPhone iPad 应用程序中编辑 Word 文档 我不会在我的应用程序中打开Word文档并更改字体样式和颜色并再
  • 关于应用层和数据库层之间的身份验证的意见

    我对一个技术困境感到困惑 我们团队中的两个人推荐了两种不同的安全模型 每种模型都有优点和缺点 绿地看起来像这样 我们有一个 ASP NET Web 应用程序 与业务层对话 与数据库对话 需求之一是能够让更高级别的用户将业务层权限委托给其他用
  • 从 jpeg 中删除文本

    我有一个包含 alpha 混合文本的 jpeg 知道字体和大小后 我推导出一个代表文本的 png 文件 使用 ImageMagick 我可以获得原始图片的近似值吗 实现此目的的一种方法是使用一种称为修复的技术 您可以在 Python Ski
  • 了解 iOS 崩溃 [SIGABRT ABORT]

    我刚刚收到来自 Crashlytics 的第一份崩溃报告 并正在尝试纠正该问题 不幸的是 它只包含一行在旧设备上运行的代码 因此我无法在 iPhone 6 上测试它 Crashlytics 的崩溃报告突出显示了两个线程 第一个内容如下 Fa
  • Singleton httpclient 与创建新的 httpclient 请求

    我正在尝试使用 HttpClient 在我的网络服务中创建层Xamarin Forms移动应用 没有单例模式 具有单例模式 in first方法我在每个新请求中创建新的http客户端对象 通过移动应用程序 这是我的代码 public Htt
  • macOS 11 Big Sur 中具有自定义视图的 NSMenuItem

    macOS 11 Big Sur 当前版本 beta 1 到 beta 6 有一个错误 功能 使得 NSMenuItem 难以使用自定义视图 具体来说 当菜单项突出显示时 项目的自定义视图不会调用draw dirtyRect 我通过 NSM
  • 读取并绑定多个 csv 文件

    我有一系列 csv 文件 每个文件一个 具有相同的列标题和不同的行数 最初我是这样读入并合并它们的 setwd lt N Ring data by cruise Shetland LengthHeight2013 lt read csv N
  • jsp中的“页面范围”是什么?

    有以下范围JSP 页面范围 请求范围 会话范围 适用范围 我对页面范围感到困惑 谁能告诉我这是什么页面范围 我在任何地方都没有找到它的明确定义 page范围意味着 它可以被认为是代表整个JSP页面的对象 即JSP 对象只能从创建它的同一页面
  • 在 Eclipse 中添加库 v7 AppCompat 时如何解决错误“未找到与给定名称匹配的资源”?

    我的项目目标是 API 级别 10 我想实现新的 ActionBar 支持库 按照中的所有说明进行操作后支持库设置 http developer android com tools support library setup html 当将
  • file.choose() 在 Windows 上打开没有文件名的对话框

    当我使用file choose or choose files选择文件时 对话窗口会显示文件夹图标 但不显示文本 以前没有出现过这个问题 我不久前更新了 RStudio 但我不确定这是否是原因 我目前使用 R 4 1 1 和 RStudio
  • CertPathValidatorException:找不到证书路径的信任锚 - Retrofit Android

    我正在创建一个 Android 应用程序 它使用https用于与服务器通信 我在用retrofit and OkHttp用于提出请求 这些对于标准来说效果很好http要求 以下是我遵循的步骤 Step 1 使用命令从服务器获取证书文件 ec