Android volley 自签名 HTTPS 信任锚未找到证书路径

2023-12-05

我是安卓新手。 这个问题已经被问过很多次了,但我已经浏览了这里几乎所有的问题。

我试图在 Node.Js 服务器上使用自签名证书(使用express)并在 android 上使用 Volley。
使用 :http://blog.applegrew.com/2015/04/using-pinned-self-signed-ssl-certificate-with-android-volley/

我不能使用http://ogrelab.ikratko.com/using-android-volley-with-self-signed-certificate/因为我的应用程序上有太多代码需要更改。

这就是错误。

javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:找不到证书路径的信任锚。

我的排球代码:

private SSLSocketFactory newSslSocketFactory() {
    try {
        // Get an instance of the Bouncy Castle KeyStore format
        KeyStore trusted = KeyStore.getInstance("BKS");
        // Get the raw resource, which contains the keystore with
        // your trusted certificates (root and any intermediate certs)
        InputStream in = mCtx.getResources().openRawResource(R.raw.evennewer);
        try {
            // Initialize the keystore with the provided trusted certificates
            // Provide the password of the keystore
            trusted.load(in, KEYSTORE_PASSWORD);
        } finally {
            in.close();
        }

        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(trusted);

        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, tmf.getTrustManagers(), null);

        SSLSocketFactory sf = context.getSocketFactory();
        return sf;
    } catch (Exception e) {
        throw new AssertionError(e);
    }
}

我的 Node.Js 代码:

var config     = {
  key: fs.readFileSync('./ssl/newkey.key'),
 cert: fs.readFileSync('./ssl/newcert.crt')
};
var port = 443;
var server = https.createServer(config, app).listen(port, function(){
console.log("Express server listening on port " + port);
});

openssl 调试返回:

验证返回码:18(自签名证书)


您可以尝试以下示例代码。希望这可以帮助!

private TrustManager[] getWrappedTrustManagers(TrustManager[] trustManagers) {
    final X509TrustManager originalTrustManager = (X509TrustManager) trustManagers[0];
    return new TrustManager[]{
            new X509TrustManager() {
                public X509Certificate[] getAcceptedIssuers() {
                    return originalTrustManager.getAcceptedIssuers();
                }

                public void checkClientTrusted(X509Certificate[] certs, String authType) {
                    try {
                        if (certs != null && certs.length > 0){
                            certs[0].checkValidity();
                        } else {
                            originalTrustManager.checkClientTrusted(certs, authType);
                        }
                    } catch (CertificateException e) {
                        Log.w("checkClientTrusted", e.toString());
                    }
                }

                public void checkServerTrusted(X509Certificate[] certs, String authType) {
                    try {
                        if (certs != null && certs.length > 0){
                            certs[0].checkValidity();
                        } else {
                            originalTrustManager.checkServerTrusted(certs, authType);
                        }
                    } catch (CertificateException e) {
                        Log.w("checkServerTrusted", e.toString());
                    }
                }
            }
    };
}    

private SSLSocketFactory getSSLSocketFactory_Certificate(String keyStoreType, int keystoreResId)
        throws CertificateException, KeyStoreException, IOException, NoSuchAlgorithmException, KeyManagementException {

    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    InputStream caInput = getResources().openRawResource(keystoreResId);

    Certificate ca = cf.generateCertificate(caInput);
    caInput.close();

    if (keyStoreType == null || keyStoreType.length() == 0) {
        keyStoreType = KeyStore.getDefaultType();
    }
    KeyStore keyStore = KeyStore.getInstance(keyStoreType);
    keyStore.load(null, null);
    keyStore.setCertificateEntry("ca", ca);

    String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
    tmf.init(keyStore);

    TrustManager[] wrappedTrustManagers = getWrappedTrustManagers(tmf.getTrustManagers());

    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(null, wrappedTrustManagers, null);

    return sslContext.getSocketFactory();
}

private SSLSocketFactory getSSLSocketFactory_KeyStore(String keyStoreType, int keystoreResId, String keyPassword)
            throws CertificateException, KeyStoreException, IOException, NoSuchAlgorithmException, KeyManagementException {

        InputStream caInput = getResources().openRawResource(keystoreResId);

        // creating a KeyStore containing trusted CAs

        if (keyStoreType == null || keyStoreType.length() == 0) {
            keyStoreType = KeyStore.getDefaultType();
        }
        KeyStore keyStore = KeyStore.getInstance(keyStoreType);

        keyStore.load(caInput, keyPassword.toCharArray());

        // creating a TrustManager that trusts the CAs in the KeyStore

        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(keyStore);

        TrustManager[] wrappedTrustManagers = getWrappedTrustManagers(tmf.getTrustManagers());

        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, wrappedTrustManagers, null);

        return sslContext.getSocketFactory();
    }

然后调用两者之一:

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

Android volley 自签名 HTTPS 信任锚未找到证书路径 的相关文章

  • 突出显示列表视图项目

    我需要在触摸列表视图项目时突出显示它并保持突出显示状态 我尝试了我发现的一切 但没有任何效果 这是我的代码 这是列表视图
  • Android 音乐播放器应用程序:如何为服务中运行的媒体播放器设置完整的侦听器?

    我正在编写一个音乐播放器应用程序 我在服务中有 MediaPlayer 对象 问题是 我不知道如何从服务更新用户界面 例如 我想更新当前歌曲的剩余时间 但是 因为 MediaPlayer 正在服务 我无法设置 MediaPlayer 对象的
  • Node.js 护照会话 Cookie 域

    我正在使用 node js Passport 并试图弄清楚如何在父域上设置 cookie 以便它可用于子域 用户登录 Domain com 然后用户访问 Sub Domain com 他应该仍然处于登录状态 如何在父域上设置 cookie
  • Android 游戏偶尔出现延迟

    我正在用 Java 制作一个简单的 Android 游戏 我注意到每 20 40 秒就会出现一些烦人的延迟 首先 我认为它们是由垃圾收集器引起的 但当我检查 LogCat 时 我发现游戏滞后时没有垃圾收集 每当游戏开始滞后时 我都会标记日志
  • 使用 START_STICKY 启动时服务进程被终止后的 onStartCommand

    我一直在阅读 Android 文档 我想知道是否有人可以阐明当以 START STICKY 启动的服务的进程被终止时服务实例会发生什么情况 我假设本地状态数据 实例变量 也丢失了 Android 在重新创建服务时是否会采取任何措施来帮助重新
  • 旋转 Google 地图中的两层标记图标

    在我的应用程序中 我向地图添加了一定数量的标记 如下所示 private fun addMarker googleMap GoogleMap location Location val options MarkerOptions optio
  • 授权标头格式错误;区域“us-east-1”是错误的;期待“eu-central-1”

    使用 Node JS 和以下配置文件 accessKeyId XXX secretAccessKey XXXX 区域 eu central 1 签名版本 v4 我仍然收到此错误消息 就好像 aws sdk 尝试访问 us east 1 Re
  • Yii2 DropDownList Onchange 更改自动完成小部件“源”属性?

    我已经尝试过这个 yii2 依赖的自动完成小部件 https stackoverflow com questions 27025791 yii2 dependent autocomplete widget 但我不知道为什么它不起作用 这是我
  • 片段活动中的 commitAllowingStateLoss()

    我的应用程序使用片段活动 它仅处于纵向模式 无法旋转屏幕 最初我使用的是commit 方法 但现在我计划不加区别地将这些更改为commitAllowingStateLoss 对于碎片活动 是否有任何理由不不加区别地执行此操作而不重新评估我使
  • Nodejs 的简单 put 请求,无需 Express

    我需要能够将 zip 文件上传到 Brightsign 单元 并考虑创建一个 Rest api 我可以发出 put 请求来发送 zip 文件 但问题是我找到的所有例子都是使用express之类的框架 是否可以在不使用额外框架的情况下在 No
  • Discord.js v12:如何等待 DM 通道中的消息?

    这是我尝试过的代码 message author dmChannel awaitMessages msg gt console log msg content 但它返回此错误消息 TypeError Cannot read property
  • 使用 Box2d(适用于 Android)进行碰撞检测?

    有人可以解释一下使用 box2d for android 进行碰撞检测的工作原理吗 我无法理解 BBContactListener 以什么方式工作 BBContactListener listener new BBContactListen
  • 使用 twitter API 1.1 在 Android 应用程序中显示 twitter feed

    基本上我想展示这个提要 https en twitter com epl live https en twitter com epl live在我的应用程序中 由于 twitter 更改了其 api 1 1 每个调用都必须经过授权 我发现的
  • Grade Plugin 3-alpha1 输出文件导致错误

    我正在尝试将项目更新到 Android Studio 3 build gradle 文件中不再接受以下代码片段 applicationVariants all variant gt variant outputs each out gt d
  • 片段中的 SavedInstanceState 始终为 null

    我使用 XML 以及活动中的 setContentView 将片段附加到活动 A 有一个问题 因为我的片段中有非常动态的视图 所以当方向改变时 我必须恢复所有的观点状态 我有问题 因为我正在使用类似的东西 public void onSav
  • 致命异常:GoogleApiHandler

    在我的项目中 我使用货币化服务 Vungle AppLovin 当我尝试加载广告时 出现此异常 E AndroidRuntime 致命异常 GoogleApiHandler 进程 kz ikar PID 3673 java lang NoS
  • 如何以编程方式检测android中可用的底部软导航栏?

    我试图通过 android 程序确定软导航栏 我没有找到直接的方法来确定 有没有办法找到导航栏的可用性 软导航栏图像在这里 以下方法对我有用并在许多设备上进行了测试 public boolean hasNavBar Resources re
  • FCM 主题是否适合更多用户?

    我对使用主题消息有点困惑 我的场景是根据通知触发一些作业 请帮助我更多地了解这一点 如果我们正在处理大量用户 则可以使用 FCM 主题向用户发送通知 我们可以只使用数据消息和主题消息吗 使用主题发送的消息是否保证送达 我在 FCM 文档中看
  • 如何删除 node_modules - Windows 中的深层嵌套文件夹

    尝试删除后节点模块创建的目录npm install 源文件名大于文件支持的名称 系统 尝试移动到路径名称较短的位置 或者尝试 在尝试此操作之前重命名为较短的名称 I also tried shift delete and still hav
  • 使用 PDFBox 在 Android 中创建 PDF

    我正在尝试通过我的 Android 应用程序创建 PDFPDFBoxapi 但出现以下错误 java lang NoClassDefFoundError org apache pdfbox pdmodel PDDocument 我已经将以下

随机推荐

  • Android 设备在 espresso 测试时不会在屏幕上启动活动

    只要我在 YouTube 视频中看到 Android 设备倾向于启动并显示在我的测试中启动的活动 我就认为这里有问题 因为我的设备根本没有反应 尽管屏幕始终处于打开状态 动画已关闭 当我尝试测试应用程序中首先运行的活动 逻辑上 时 我尝试在
  • 字符串内存分配

    哪一个更好 System out println hello world or String s hello world System out println s 对于这个简单的例子来说 内存分配没有区别
  • 同一 Makefile 中 make 目标之间的递归依赖关系

    我正在尝试编写一个 makefile 它能够确定标头何时更改 然后重新编译相应的 cpp 文件 为了测试这一点 我创建了三个文件 main cpp a h and b h main cpp包括 sa h and a h包括b h 我的 ma
  • R:使用 ggplot2 绘制多个函数

    我需要绘制多个显式函数定义以直观地比较它们 考虑函数族 fun 1 lt function x 1 0 01 x fun 2 lt function x 1 0 1 x fun 3 lt function x 1 0 3 x 这个想法是绘制
  • 动画 GIF 仅在第一帧上是透明的 (Python PIL)

    以下代码从两个图像创建一个 GIF GIFs are always palette images so they would be converted later anyway im1 PIL Image open grin emoji b
  • 从 Spring Integration 的 @Gateway 方法返回 ResponseEntity

    I have IntegrationFlow我在其中调用 HTTP 端点 Bean public IntegrationFlow getInformationFlow RestTemplate restTemplate return Int
  • 使用 requests 和 BeautifulSoup 下载文件

    我正在尝试从以下位置下载一堆 pdf 文件here using requests and 美丽汤4 这是我的代码 import requests from bs4 import BeautifulSoup as bs ANO 2013 ME
  • 如何测量标记分割图像的平均厚度

    我有一张图像 我已经对该图像进行了一些预处理 下面我展示了我的预处理 img cv2 imread my drive image 69 tif 0 median cv2 medianBlur img 13 ret th cv2 thresh
  • 创建在插入时引发异常的触发器

    我的寒假大学任务很少 其中之一就是在桌子上创建触发器 PERSON ID Name Surname Age 触发器应该在用户插入具有无效 ID 的行时通知用户 有效性标准是 ID 长度为 11 位 我尝试写这样的解决方案 CREATE OR
  • 在 JavaScript 中将 ObjectID (Mongodb) 转换为字符串

    我想在 JavaScript 中将 ObjectID Mongodb 转换为字符串 当我从 MongoDB 获取对象时 它就像一个对象一样有 时间戳 秒 公司 机器 我无法转换为字符串 尝试这个 mongo shell objectId s
  • 计算 Spotfire 中特定行的同一列的差异

    我在 Spotfire 中使用计算列进行行差异计算时遇到问题 我想知道是否可以创建一个计算列来计算当前行与具有不同属性的下一行之间的差异 示例表可能是这样的 结果可能是这样的 基本行是 When type 1 则计算其电流之差value及其
  • Google Drive API V3 Javascript - 创建包含内容的文件

    这个问题之前已经被问过 但答案是使用 API V2 谷歌文档没有阐明如何使用 javascript 客户端代码创建包含其内容的文件 我尝试使用 Node 下列出的代码 但是 它只创建文件 不插入任何内容 这是我的代码 let fileMet
  • 子图中的 networkx 正在部分绘制轴框架之外的节点

    当我在子图中绘制 networkx 图时 一些节点在轴的框架中被部分切断 我已经尝试过使用所有不同类型的图表和布局 这始终是一个问题 它总是切断我的节点 就好像 networkx 在比实际更大的轴上绘制图表 这是一个最小的例子 plt su
  • Onpaint 事件(无效)在一段时间正常运行(运行时)后改变执行顺序

    我有 3 个数据图 它们是通过其绘制事件绘制的 当我需要将数据插入到图表中时 我调用控件 invalidate 命令 第一个控件的绘制事件实际上为其他 2 个图形创建了一个位图缓冲区 以避免重复长循环 因此无效命令按特定顺序排列 1 2 3
  • 返回 SQL 中列上所有可能的值组合

    如何返回 2 列中所有值组合的列表 以便它们成为 T SQL 中的新行 e g Col1 Col2 1 2 1 4 1 5 并将其转化为所有组合 1 2 1 4 1 5 2 4 2 5 4 5 假设至少是 SQL 2005CTE with
  • 在表单提交中实现 jQuery 确认模式?

    我正在使用 jQuery 模式确认 如下所示 function dialog confirm dialog resizable false height 190 width 330 modal true buttons Yes functi
  • 使用 MSI 连接 Azure SQL Server - Django

    我已使用以下命令成功连接 Azure SQL ServerAccessToken in the pyodbc 这里我没有使用username or password连接数据库 相反 我用了attrs before通行证token 这里我自动
  • 如何按文件拆分每个提交?

    我知道如何使用手动拆分提交git rebase i 但是如何按文件自动拆分分支中的每个提交 例如 提交A修改了3个文件 f1 f2和f3 拆分后 有 3 个提交 A f1 A f2 和 A f3 我想这样做是为了使主要重写变得更容易 因为我
  • 注入名称中带有点的工厂

    我需要在 Jasmine 中使用 angularjs 模拟注入方法来注入名称中带有点的服务 我尝试添加字符串标识符 但注入方法似乎不支持此操作 这不可能 beforeEach inject rootScope MyApp Factories
  • Android volley 自签名 HTTPS 信任锚未找到证书路径

    我是安卓新手 这个问题已经被问过很多次了 但我已经浏览了这里几乎所有的问题 我试图在 Node Js 服务器上使用自签名证书 使用express 并在 android 上使用 Volley 使用 http blog applegrew co