SSLSocket 创建时发生 Java 异常

2023-12-31

在代码中:

System.setProperty("javax.net.ssl.trustStore", cacerts);
System.setProperty("javax.net.ssl.trustStorePassword", pwdCacerts);

SSLSocketFactory sslsocketfactory = (SSLSocketFactory)  SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("localhost", port);

我得到一个 Java 异常:

java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)
    at javax.net.ssl.DefaultSSLSocketFactory.throwException(Unknown Source)
    at javax.net.ssl.DefaultSSLSocketFactory.createSocket(Unknown Source)
    at PracticaRO.Cliente.main(Cliente.java:24)
Caused by: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)
    at java.security.Provider$Service.newInstance(Unknown Source)
    at sun.security.jca.GetInstance.getInstance(Unknown Source)
    at sun.security.jca.GetInstance.getInstance(Unknown Source)
    at javax.net.ssl.SSLContext.getInstance(Unknown Source)
    at javax.net.ssl.SSLContext.getDefault(Unknown Source)
    at javax.net.ssl.SSLSocketFactory.getDefault(Unknown Source)
    at PracticaRO.Cliente.main(Cliente.java:23)
Caused by: java.io.IOException: Invalid keystore format
    at sun.security.provider.JavaKeyStore.engineLoad(Unknown Source)
    at sun.security.provider.JavaKeyStore$JKS.engineLoad(Unknown Source)
    at java.security.KeyStore.load(Unknown Source)
    at sun.security.ssl.TrustManagerFactoryImpl.getCacertsKeyStore(Unknown Source)
    at sun.security.ssl.SSLContextImpl$DefaultSSLContext.getDefaultTrustManager(Unknown Source)
    at sun.security.ssl.SSLContextImpl$DefaultSSLContext.<init>(Unknown Source)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at java.lang.Class.newInstance(Unknown Source)
    ... 7 more

它工作得很好,直到我将新的公钥导入到 cacerts 中-keytool -import -keystore cacerts -alias kpServer type JCEKS -file Server.cer是什么导致了上面的异常。

预先感谢您的任何帮助。


我将引导您完成设置过程。我建议您对所有内容都使用一个密码,以免一开始就感到困惑。

请按照以下步骤操作:
1.在命令行上:

使用 RSA 创建公钥/私钥对,2048 位,实体名称为“secureEntity”,存储在文件“server.keyStore”中。
1.1keytool -genkeypair -alias secureEntity -keyalg RSA -keysize 2048 - keystone server.keyStore

该命令存储了“secureEntity”的私钥和公钥。
私钥,只有您可以访问它(通过知道文件密码)。
公钥存储为证书,因此它遵循 X509 证书协议字段。这样我们就可以假设它包含一个公钥,并且该公钥与“secureEntity”相关联。
这就是我们验证服务器发送给客户端的证书时需要知道的信息。
SSL 第一步验证是由客户端进行的,因此客户端首先验证服务器。
现在我们已经生成了一个证书并将其存储在 server.keyStore 中,我们可以将其导出,以便能够将其导入到一个或多个 trustStore 中。
我们的做法:
1.2keytool -exportcert -alias secureEntity -文件导出.cer -keystore server.keystore

所以现在我们可以添加到我们真正的 trustStore 文件中,它会要求我们在导入后确认我们确实信任该实体。如果该文件不存在,它会自动创建。
1.3keytool -importcert -alias secureEntity -keystore trustEntities.trustStore -文件导出.cer

现在为了方便起见,让我们将其导入到仅包含服务器证书的文件中:
1.4keytool -importcert -alias secureEntity -keystore serverKeys.keyStore -文件导出.cer

所以现在你的服务器应该有一个私钥和公钥(证书)。

In JAVA:

客户端:
System.setProperty("javax.net.ssl.trustStore","trustedEntities.trustStore")
并在此处创建 sslsocket

服务器端:
System.setProperty("javax.net.ssl.keyStore", "serverKeys.keyStore")
System.setProperty("javax.net.ssl.keyStorePassword", "您之前定义的 serverKeys.keyStore 文件密码")

创建一个服务器 ssl 就这样了。 希望这可以帮助。干杯!

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

SSLSocket 创建时发生 Java 异常 的相关文章

  • 将 WAR 部署到 Tomcat(Spring Boot + Angular)

    我正在尝试使用以下命令部署 Spring Boot 应用程序WAR包装至Tomcat 10 应用程序已成功部署 但是 当我尝试访问端点时 它会导致404 未找到 战争文件 应用程序 war http localhost 8080 appli
  • 使用itext java库复制时pdf文件大小大大增加

    我正在尝试使用 Java 中的 itextpdf 库将现有的 pdf 文件复制到一些新文件中 我使用的是 itextpdf 5 5 10 版本 我在两种方式上都面临着不同的问题 PDFStamper 和 PdfCopy 当我使用 PDFSt
  • 如何重复一段文本中的每个字母?爪哇语

    就像在口吃中一样 如果文本为 dean 并且乘数为 3 则结果将是 dddeeeaaannn 由提供的乘数指定的次数 public static void repeatLetters String text dean int n 3 Str
  • Java:为什么.class文件中的方法类型包含返回类型,而不仅仅是签名?

    class 文件的常量池中有一个 NameAndType 结构 它用于动态绑定 该类可以 导出 的所有方法都被描述为 签名 返回类型 喜欢 getVector Ljava util Vector 当某些 jar 中方法的返回类型发生更改时
  • Spring Data Jpa OneToMany 同时保存子实体和父实体?

    这是我的父实体 注意 为了简洁起见 删除了 getter setter lombok 注释 Entity public class Board Id GeneratedValue strategy GenerationType IDENTI
  • 如何杀死 Java Future?

    我正在开发的服务使用 Future 来并行运行多个任务 每个任务最多可能需要一分钟才能完成 然而 外部库似乎有问题 因为在某些情况下 2 的时间 它不会返回 在这些情况下 我想给出 2 分钟的等待时间 如果还没有返回 我想杀死 future
  • Java:一种将 Mime(内容)类型与 CommonsMultipartFile 中的文件扩展名相匹配的方法

    在我的公司 出于额外原因 我需要将 mime 类型与文件扩展名进行比较 我有一个CommonsMultipartFile 我正在尝试找出进行这种比较的最佳方法 我见过一个MimetypesFileTypeMap 但不确定这是否适用于此 我试
  • 当前平台不支持桌面 API

    我遇到过这个错误 java lang UnsupportedOperationException 当前平台不支持桌面 API 我将从我的 java 应用程序中打开一个文件 我用这个方法 Desktop getDesktop open new
  • 当我们使用赋值而不是比较时,如何评估 if/while 条件?

    我在学习 Java 的 OCA OCP 时发现了这个令人惊讶的事情 下面是第一段代码 其中 if 测试条件 部分 让我惊讶 public class BooleanIf public static void main String args
  • 使用正则表达式验证电子邮件的最大长度

    我找到了用于电子邮件验证的正则表达式 a z0 9 a z0 9 a z0 9 a z0 9 a z 2 4 我希望电子邮件的最大长度为 20 个字符 因此我将其更改为 a z0 9 a z0 9 a z0 9 a z0 9 a z 2 4
  • 是否可以创建 Java RAM 磁盘以与 java.io.* API 一起使用?

    我正在使用一个第三方库 它基本上创建一个输出目录 其中包含不同类型的文件和子目录 我希望能够编写单元测试来确认输出正确 我希望能够将库与 RAM 磁盘一起使用 这样库所做的任何事情都不会以任何方式接触实际的磁盘板 这个想法是让测试运行和清理
  • JFrame 在连续运行代码时冻结

    我在使用时遇到问题JFrame 它会冻结 连续运行代码 下面是我的代码 点击时btnRun 我调用了该函数MainLoop ActionListener btnRun Click new ActionListener Override pu
  • java彩色滚动条搜索结果

    我将如何在 Java 中自定义滚动条 以便我可以进行像 chrome 一样的搜索 也就是说在结果所在的位置放置彩色条纹 我不想要一个库 因为我更喜欢自己编写代码 另外 我不想失去我拥有的 L F 欢迎举例 实际上 它将查看一个大的文本文件或
  • javadoc 子集/java 库组织

    我自己从来没有运行过javadoc 无论是在命令行还是ant 的 javadoc 任务 http ant apache org manual Tasks javadoc html 我将使用 ant 我需要为我编写的库生成 javadoc 问
  • Java 8:如何创建毫秒、微秒或纳秒的 DateTimeFormatter?

    我需要创建格式化程序来解析具有可选的毫秒 微米或纳秒分数的时间戳 例如 对于我的需求 我看到以下机会 DateTimeFormatter formatter new DateTimeFormatterBuilder append DateT
  • 添加 char 和 int

    据我了解 字符是一个字符 即一个字母 一个digit 标点符号 制表符 空格或类似的东西 因此 当我这样做时 char c 1 System out println c 输出 1 正是我所期望的 那么为什么当我这样做时 int a 1 ch
  • 如何在一次操作中使用 Thymeleaf 检查 null 和空条件?

    有什么方法可以检查 Thymeleaf 中的 null 和empty 条件吗 方法一 1 variable1 variable2 variable3 2 variable null 3 variable 如果我们结合两个条件 例如 vari
  • 在 Tensorflow-lite Android 中将位图转换为 ByteBuffer(浮点)

    在用于图像分类的tensorflow lite android演示代码中 图像首先转换为ByteBuffer格式以获得更好的性能 这种从位图到浮点格式的转换以及随后到字节缓冲区的转换似乎是一个昂贵的操作 循环 按位运算符 float mem
  • Axis2 的 wsdl2java 在 RPC/Encoded 样式 Web 服务上失败

    Axis2 有替代方案吗 或者让它工作的方式 例如不同的数据绑定 Retrieving document at Exception in thread main org apache axis2 wsdl codegen CodeGener
  • MyBatis 枚举的使用

    我知道以前有人问过这个问题 但我无法根据迄今为止找到的信息实施解决方案 所以也许有人可以向我解释一下 我有一个表 状态 它有两列 id 和 name id是PK 我不想使用 POJO Status 而是使用枚举 我创建了这样一个枚举 如下所

随机推荐

  • 将 UDT 子类型转换为超类型

    我在 Oracle 18c 中使用名为 ST GEOMETRY 的用户定义类型 UDT ST Geometry 存储类型 https desktop arcgis com en arcmap latest manage data using
  • 如何将“~/default.aspx”转换为“http://www.website.com/default.aspx”C#?

    我知道 ASP NET 自动执行此操作 但由于某种原因我似乎找不到该方法 帮助任何人吗 就像标题说的那样 如果我执行 Response Redirect Default aspx 它可以工作 但我不想重定向该网站 我只想要完整的网址 谁能帮
  • SQL 查询获取具有列最大值的表的行详细信息

    我有两张桌子 表格1 Num 1 2 3 Table 2 Num Date Amount 1 12 31 30 1 12 30 31 1 12 29 20 2 12 31 100 2 12 30 90 3 12 31 12 4 11 1 1
  • 烤宽面条自动编码器:如何使用解码器部分?

    假设我在烤宽面条中有一个自动编码器 有两个编码层和两个 InverseLayers 作为解码器 input InputLayer l1 Conv1DLayer input l2 DenseLayer l1 decoder part l2p
  • capybara-webkit:自动保存 RSpec 测试失败的屏幕截图

    当使用 capybara webkit 和 Rspec 测试失败时 如何自动保存 html 和屏幕截图 当 RSpec 测试失败时如何执行回调 加分点 如何避免出现以下错误 Capybara Driver Webkit WebkitInva
  • JS mouseenter 触发两次

    问题是关于事件 mouseenter 被触发两次 代码在这里 http jsfiddle net xyrhacom http jsfiddle net xyrhacom HTML div class elt text1 div class
  • Java、JPA、Glassfish、无效资源:jdbc/__default__pm

    我使用 Glassfish 3 1 2 2 构建 5 JPA EclipseLink MySQL 我通过 Glassfish 管理面板创建了 MySQL 池 从 GF 管理面板 Ping 到 MySQL 正常 我使用 persistence
  • 从 iframe 触发 jQuery 事件

    这是场景 我在 iframe 内发生了事件 到目前为止一切都运行良好 我刚刚遇到了一个问题 我想将事件从 iframe 分派到父级 我用它来触发 iframe 中的事件 body window parent document trigger
  • CMake:找到用 MinGW/MSYS 构建的 wxWidgets?

    我使用 MinGW 编译了 wxWidgets 2 8 12 为了实际进行构建 我通过 MSYS shell 调用了随 wxWidgets 一起分发的 autotools 构建文件 使用安装前缀为 H MinGW libs 这样做的结果是我
  • Android 拼写检查器设置意图

    在 Android 中 我可以启动键盘与输入设置对话框使用ACTION INPUT METHOD SETTINGS intent getPresenter startActivity new Intent Settings ACTION I
  • 如何找出 R 函数调用中使用了哪些参数值?

    我想知道是否有一个 Base R 函数来提取特定函数调用中使用的参数值 例如 对于每个对象x y and z下面 是否有一种通用的方法来提取参数名称 例如 n sd rate scale 正在使用和值 例如 1e4 for n 由用户或系统
  • Java:如何通过管道将InputStream传输到标准输出?

    有没有一种简单 因此快速 的方法来实现这一点 基本上只需要一些输入流 可能类似于socket getInputStream 并让流的缓冲区自动重定向到标准输出 没有简单的方法可以做到这一点 因为InputStream有一个拉式界面 当Out
  • 为什么重写方法不能抛出比被重写方法更广泛的异常?

    我正在阅读 Kathe Sierra 的 SCJP 6 书 并发现了关于在重写方法中抛出异常的解释 我完全没听懂 谁能给我解释一下吗 重写方法不得抛出新的已检查异常 或者比被重写方法声明的更广泛 例如 一个 声明 FileNotFoundE
  • PHP implode 数组生成 mysql IN 标准

    我有一个如下所示的函数 public function foo cities array anaheim baker colfax db global instance of Zend Db Adapter Pdo Mysql query
  • 模拟用户输入

    android 可以模拟用户输入吗 例如 有一些服务或一些线程将在后台工作并启动一些模拟用户输入的东西 因此如果我们在主屏幕上并且发生了模拟输入 假设单击 那么如果模拟的坐标是应用程序应该启动单击指向主屏幕上的某个图标 或者如果模拟输入指向
  • 微调器中的默认文本填充是什么

    我有一个微调器和一个风格类似于微调器的文本视图 我想对齐两者中的文本 但我不知道微调器中的文本有多少填充 你可以找到一件事安卓风格 https android googlesource com platform frameworks bas
  • 如何使用 Python 访问 Ring 0?

    这个答案指出Python中类的命名不是由于特殊特权而完成的 here https stackoverflow com questions 5602439 reasons behind naming in easy to confuse py
  • 如何比较 4 列

    我正在使用 Excel 中的表格 以下是工作表的示例 A B C D al id id id df id desc desc df id id desc df id id id ff desc id desc ff desc id desc
  • OS X 上的 sed - 似乎无法在正则表达式中使用 +

    现在根据所有文献 echo 1234abcd sed s 0 9 g 应该输出 abcd 和 echo abcd sed s 0 9 g 应该输出abcd 但在 OS X 10 4 11 上 第一个表达式输出 1234abcd 在第一个示例
  • SSLSocket 创建时发生 Java 异常

    在代码中 System setProperty javax net ssl trustStore cacerts System setProperty javax net ssl trustStorePassword pwdCacerts