错误[Ljava.lang.Object;将 X509Certificate 的数组列表转换为数组时,无法转换为 [Ljava.security.cert.X509Certificate

2024-01-02

我对这个 ssl 和证书很陌生。我有一个 jks 文件,其中包含服务器信任的一些证书。我试图从 jks 文件中读取所有证书并将其返回到 getAcceptedIssuers() 方法。证书的类型为 X509Certificate。 我实现的方法正确读取 jks 文件并创建 X509Certificate 证书的数组列表。接下来,当我尝试将 arraylist 转换为数组时,出现此异常

[Ljava.lang.Object; cannot be cast to [Ljava.security.cert.X509Certificate;
    at com.sample.ssl.GetCertificates.loadCertificatesFromCompanJks(GetCertificates.java:125)
    at com.sample.ssl.GetCertificates$1.getAcceptedIssuers(GetCertificates.java:44)
    at sun.security.ssl.AbstractTrustManagerWrapper.checkAlgorithmConstraints(Unknown Source)
    at sun.security.ssl.AbstractTrustManagerWrapper.checkAdditionalTrust(Unknown Source)
    at sun.security.ssl.AbstractTrustManagerWrapper.checkServerTrusted(Unknown Source)
    at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
    at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
    at sun.security.ssl.Handshaker.processLoop(Unknown Source)
    at sun.security.ssl.Handshaker.process_record(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.getSession(Unknown Source)
    at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:91)
    at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:397)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148)
    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:573)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)
    at com.sample.ssl.GetCertificates.postMessage(GetCertificates.java:82)
    at com.sample.ssl.GetCertificates.main(GetCertificates.java:138)

我的代码如下

public class GetCertificates {
    static private TrustManager[] trustmgr = new TrustManager[]{new X509TrustManager() {

        private X509Certificate[] certs = null;

        public void checkClientTrusted(X509Certificate[] certs, String authType) {
            System.out.println("checkClientTrusted");
        }

        public void checkServerTrusted(X509Certificate[] certs, String authType) {
            System.out.println("checkServerTrusted");
        }

        public X509Certificate[] getAcceptedIssuers() {
            System.out.println("getAcceptedIssuers");
            certs = loadCertificatesFromCompanJks("C:/Users/vinod/Desktop/keystore.jks", "mypassword");
            // return new
            // X509Certificate[]{};
            return certs;
        }
    }};

    public void postMessage() {
        try {
            // here I prepare Url to execute and make a call
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static X509Certificate[] loadCertificatesFromCompanJks(String jksPath, String keyStorePassword) {
        try {
            X509Certificate X509Certificate[] = null;
            Certificate[] certs = null;

            ArrayList<X509Certificate> serverCerts = new ArrayList<X509Certificate>();
            FileInputStream is = new FileInputStream(jksPath);
            KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
            String password = keyStorePassword;
            keystore.load(is, password.toCharArray());

            Enumeration e = keystore.aliases();
            for (; e.hasMoreElements(); ) {

                String alias = (String) e.nextElement();
                Certificate cert = keystore.getCertificate(alias);
                X509Certificate cert1 = (X509Certificate) cert;
                serverCerts.add(cert1);
            }
            is.close();
            System.out.println("Number of server certificates : " + serverCerts.size());
            X509Certificate = (java.security.cert.X509Certificate[]) serverCerts.toArray();
            return X509Certificate;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {
        new GetCertificates().postMessage();
    }
}

你的错误在这里:

X509Certificate = (java.security.cert.X509Certificate[]) serverCerts.toArray();

那个超载的toArray()将返回一个Object[] and an Object[]无法转换为不同的数组类型。

将该行更改为:

X509Certificate = serverCerts.toArray(new X509Certificate[serverCerts.size()]);

在这里,您分配正确类型和大小的数组,并将其传递给toArray从列表中填写。

(你也可以这样写...

X509Certificate = serverCerts.toArray(new X509Certificate[0]);

...但这会导致不必要的分配。请阅读 javadoctoArray(...)为了更好的理解。 (不可否认,额外分配的成本很小,您可以通过传递预分配/共享的零大小数组来避免它。))


在此过程中,更改变量名称以符合 Java 样式约定。在同一行代码中对类型和变量使用相同的标识符是非常令人困惑的!

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

错误[Ljava.lang.Object;将 X509Certificate 的数组列表转换为数组时,无法转换为 [Ljava.security.cert.X509Certificate 的相关文章

  • 有没有一种独立的JAVA可以在PC上运行而无需任何操作系统

    据我所知 java 程序可以在任何操作系统上运行 任何类型的机器都有 JVM 我需要一个在我的 PC 上独立运行的 JVM 而不是在我的操作系统 Windows 或任何其他操作系统 上运行 我的意思是 JVM 的作用类似于启动 而不是操作系
  • Java程序验证signtool签名的数字签名

    我已经使用 SignTool 对文件 exe 或 dll 不是 jar 文件 进行了数字签名 Signtool还可以验证数字签名 但我的要求是使用java程序检查由signtool签名的文件的数字签名 我在互联网上搜索但没有找到任何信息 您
  • 通过代理从java发送电子邮件

    我使用 Java Mail API 来发送和接收电子邮件 现在我做这个项目的地方有一个代理服务器 我可以知道如何通过代理服务器从java发送电子邮件吗 请参阅此处的常见问题解答 http www oracle com technetwork
  • Java 将 String[] 转换为 int[]

    我有一个 String 其中每个元素都可以转换为整数 将其转换为 int 的最佳方法是什么 int StringArrayToIntArray String s public static int StringArrToIntArr Str
  • GWT 代码服务器在使用 Maven 原型的新生成的项目中找不到模块

    我已经使用 GWT 和 eclipse 一段时间了 我想玩一下 Maven 和 GWT 插件 gwt maven plugin 在此输入链接描述 http mojo codehaus org gwt maven plugin 我尝试在 Ec
  • Android - 使用 Intent 打开 PDF 文档关闭后不保存

    我面临的问题是 当尝试保存对使用此 URI 打开的 PDF 文档的更改时内容 xx xxx xxx fileprovider external Download Sync FileName pdf 我所做的任何更改在关闭文档后都不会保存 但
  • Android Studio 中没有参考文档

    昨天刚刚出现了一个新问题 当我将鼠标悬停在方法上或按 Ctrl Q 时 我通常会获取该特定方法的文档信息 但现在我只是得到 按 Ctrl QSharedPreferences getLong Following external urls
  • 使用java将文件从GCS存储桶传输到SFTP服务器

    我能够从 GCS 存储桶读取文件 但所有库都喜欢jsch将文件传输到 SFTP 服务器时会查找文件路径 而不是内存中的文件 我不想将从GCS读取的文件写入磁盘 如何将内存中的文件传输到SFTP 我假设您想上传内存中的数据 JSch 实际上有
  • IntelliJ 对于 Java 项目使用的默认构建过程是什么?

    直接从 IntelliJ 中的 IDE 构建 Java 项目非常好 它速度很快 而且很有效 我无法找到任何有关 IntelliJ 如何进行这些默认构建的文档 我猜它使用Ant 我想做的是为下载我的项目的任何人自动化这个快速 轻松的构建过程
  • 如何更改使用 Google ReCaptcha 版本 2 时的错误消息?

    当为 Google ReCaptcha 版本 2 选择多张照片时 会显示以下错误消息 需要多个正确的解决方案 请解决更多 如何将错误消息更改为我网站上的自定义消息 这是图像 我认为不可能在服务器端 在谷歌 进行 这可以在客户端通过利用 js
  • Maven 依赖冲突:org.w3c.dom.ElementTraversal

    我有一个 Java 代码库 它使用 Maven 进行依赖项解析并在 CI 上运行测试 经过最近的一批开发 大到足以很难识别重大更改 我的一些测试现在在通过 Maven 运行时失败了NoClassDefFoundError for org w
  • Android Studio安装JDK错误

    In Android Studio I am facing bellow error 当我按下时会显示此弹出窗口Alt Enter对于缺少的类 符号 当我点击 setup SDK 时 它显示两个选项 1 8 Java版本 1 8 0 60
  • 清单合并失败:需要为 显式指定 android:exported

    我的清单文件有问题 错误消息 清单合并失败 android 需要为 明确指定导出 面向 Android 12 及更高版本的应用需要指定显式值android exported当相应的组件定义了意图过滤器时 有关详细信息 请参阅 https d
  • 从 Spring 启动运行 Java 类

    我使用的是Java8和Spring4 3 1 我有一个 Java Spring 应用程序托管由浏览器和移动应用程序客户端访问的 RESTfult 服务 其次 我编写了一个侦听事件的聊天服务器 socket io 来自客户 该聊天服务器正在从
  • 我们可以将请求分派到 servlet 内的 HTML

    这可能吗 RequestDispatcher rd request getRequestDispatcher index html rd forward request response 是的 您可以将请求分派到 HTML 页面
  • 无法读取使用 DataOutputStream 发送的号码

    这是我的客户端代码 Random rand new Random int n rand nextInt 50 1 DataInputStream dis new DataInputStream socket getInputStream D
  • 找不到满足版本限制的“com.google.code.findbugs:jsr305”版本

    当生成签名的 APK 进行发布时 我收到此错误消息 Cannot find a version of com google code findbugs jsr305 that satisfies the version constraint
  • 为什么我得到:没有有效的 JFX 运行时

    我有一个使用 java 1 6 编译并使用 jnlp webstart 运行的现有应用程序 如果我使用 JRE 1 6 从客户端运行此应用程序 一切都会很好 但是 当我使用 java JDK 7 编译代码并使用 JRE 1 7 67 运行客
  • SQL准备语句如何通过多个可能的菜单选择进行选择?

    所以我有 4 个菜单选择 产品 位置 课程类型和类别 所有这些都可以为空 使用 JSF 编程 但这应该与这个问题无关 因为它是一个 SQL 问题 菜单选择将向托管 bean 发送用户选择的变量 并使用准备好的语句使用用户选择的菜单中的信息
  • 如何在 Hibernate 中使用 SELECT 进行 INSERT

    我需要在休眠中实现以下请求 insert into my table max column values select max id from special table where 如何在休眠中使用注释来做到这一点 Special tab

随机推荐

  • 如何将数据分成 3 组(训练、验证和测试)?

    我有一个 pandas 数据框 我希望将其分为 3 个独立的集合 我知道使用训练测试分割 http scikit learn org stable modules generated sklearn cross validation tra
  • 使用 JavaScript/jQuery 更改表单的操作

    我遇到了一个让我抓狂的问题 我正在尝试修改 openid 选择器以支持 facebook 我使用 RPXNow 作为我的提供程序 因此它要求将表单提交到与标准不同的 url 例如 RpxNow 要求我像这样设置我的表单
  • 检查一个向量是否是 R 中另一个向量的超集

    我有以下向量列表 a lt c 1 2 4 5 6 7 8 9 b lt c 1 2 4 5 c lt c 1 2 3 10 11 12 13 14 d lt c 1 2 3 10 15 16 17 18 19 e lt c 1 2 3 1
  • 移动设备上的字体非常小

    我有一个 p 块在一个巨大的 p div 在我的 html 主体中 80 在font size 而且我还有一个页脚 div 在我身体的下部 页脚的文字也占了80 font size 如果我在PC上测试它是相等的 但如果我在移动设备上测试它
  • Mongodb:活动:失败(结果:退出代码)

    gt mongod service MongoDB Database Server gt Loaded loaded lib systemd system mongod service enabled vendor preset enabl
  • 我如何用图像填充矩形?

    通常你可以在画布上填充一个矩形ctx fillStyle whatever color here 进而ctx fillRect cords and length and width here 有没有一种语法可以让我说ctx fillRect
  • reloadAllTimelines 不适用于 UserDefaults

    我的小部件从以下位置加载一些数据UserDefaults Appgroups并根据它显示一些文本和图片 这适用于第一次启动 如果我更改 UserDefaults 并使用WidgetCenter shared reloadAllTimelin
  • Django 表单有选择但也有自由文本选项?

    我正在寻找什么 一个小部件 为用户提供一个下拉选择列表 但下面还有一个文本输入框 供用户输入新值 后端模型将有一组默认选择 但不会在模型上使用choices关键字 我知道我可以 而且我已经 通过让表单同时具有 ChoicesField 和
  • 如何在 flutter 构建窗口中包含 dll

    我正在开发一个在开发中运行良好的 flutter 项目 但是我不知道如何让构建包含使用 FFI 引用的 dll 我找不到关于如何执行此操作的明确说明 我尝试按照以下步骤构建 msixhere https flutter dev deskto
  • 如何在 pandas 数据框中进行 SQL 样式聚合

    我希望有一个SQLPython 中的样式聚合 Example DataFrame df pd DataFrame ID 1 1 2 2 2 revenue 1 3 5 1 5 month 2012 01 01 2012 01 01 2012
  • numpy:将 argsort 应用于数组

    The argsort http docs scipy org doc numpy reference generated numpy argsort html numpy argsort函数返回一个索引矩阵 可用于索引原始数组 以便结果与
  • bash 合并多行

    我有一个文件看起来像 id001 success 100 id002 success 99 id002 failed 1 id003 failed 100 id004 success 50 id004 failed 50 我想将其格式化为
  • 用 Java 获取本月的最后一个星期五

    我正在开发一个项目 要求将日期计算为给定月份的最后一个星期五 我想我有一个仅使用标准 Java 的解决方案 但我想知道是否有人知道更简洁或更高效的解决方案 以下是我今年测试的内容 for int month 0 month lt 13 mo
  • 如何让 EFCore 内存数据库自动递增非键字段

    我们有一个以 guid 为键的实体 以及另一个基于自动递增 int 属性的人类可读键 运行应用程序时 这将按预期工作 出于测试目的 我们使用 EF 内存数据库 但这似乎只会自动递增列 如果它也是键 使用属性注释属性或 Fluent API
  • 如何从 google place api 获取营业时间

    这里我有一个工作正常的代码 所以这里是简单的谷歌位置代码 它根据位置向我显示一个位置 我在每个标记上添加一个标签 这样 http jsbin com UqafeCI 4 edit http jsbin com UqafeCI 4 edit
  • 您必须为 TextView android 错误提供资源 ID

    我一整天都在尝试解决这个错误 我不明白为什么我的 logcat 打印 05 06 21 45 59 559 ERROR ConversationList 9023 We have chats 05 06 21 45 59 609 ERROR
  • 使用php邮件功能有限制吗?

    我正在使用 php 和 mysql 我将发送 10k 一万多 封电子邮件来更新我的订阅者 这是我第一次发送它们 我将使用 php 邮件功能 基本上这就是我要做的 首先从数据库中获取数据 Select name email FROM data
  • 如何处理 AES CTR 的 IV/Nonce/Counter?

    import javax crypto Cipher public abstract class Crypto private static final String CIPHER ALGORITHM AES CTR NoPadding p
  • numpy ValueError 形状未对齐

    所以我正在尝试改编迈克尔 尼尔森的神经网络http neuralnetworksanddeeplearning com chap1 html http neuralnetworksanddeeplearning com chap1 html
  • 错误[Ljava.lang.Object;将 X509Certificate 的数组列表转换为数组时,无法转换为 [Ljava.security.cert.X509Certificate

    我对这个 ssl 和证书很陌生 我有一个 jks 文件 其中包含服务器信任的一些证书 我试图从 jks 文件中读取所有证书并将其返回到 getAcceptedIssuers 方法 证书的类型为 X509Certificate 我实现的方法正