Java:如何添加SSL客户端身份验证

2023-12-21

我有以下代码使用 SSL 连接服务器与客户端,现在我想添加客户端身份验证:

(我有一个服务器密钥库(JCEKS 类型)和一个客户端密钥库(JKS 类型),服务器使用信任库(cacerts),我在其中导入了两个证书,因为我也想使用此信任库进行客户端身份验证)

客户端代码:

System.setProperty("javax.net.ssl.trustStore", cerServer);
System.setProperty("javax.net.ssl.trustStoreType","JCEKS");
System.setProperty("javax.net.ssl.trustStorePassword", pwdCacerts);

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

服务器代码:

KeyStore ks = LoadKeyStore(new File(serverKeyStore), pwdKeyStore, "JCEKS");
KeyManagerFactory kmf; 
kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ks, pwdKeyStore.toCharArray());

SSLContext sc = SSLContext.getInstance("SSL");
sc.init(kmf.getKeyManagers(),null, null);   

SSLServerSocketFactory ssf = sc.getServerSocketFactory(); 
sslserversocket = (SSLServerSocket) ssf.createServerSocket(port);

预先感谢您的任何帮助。

编辑: 我在服务器端添加此代码:

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

但如果我删除 cacerts 中的客户端证书,连接不会给我错误,因此我认为这样是错误的


如果您希望系统使用客户端证书身份验证,您需要

  • 服务器请求(或要求)客户端证书。这是通过设置完成的setWantClientAuth(true)在服务器套接字上(或setNeedClientAuth, 分别)。您还需要服务器公布它接受的 CA,这通常是通过使用服务器上的信任库来完成的,该信任库包含颁发客户端证书链的 CA(这似乎是您通过设置来完成的)javax.net.ssl.trustStore*在服务器上)。

  • 客户端配置一个密钥库,其中包含客户端证书(如果有中间 CA,则可能是链)及其私钥。这可以通过设置来完成javax.net.ssl.keyStore*(这可能会影响其他连接)或使用KeyManagerFactory与您在服务器端完成的方式相同。

如果你使用setWantClientAuth(true),您可能仍然不会收到错误,因为服务器将接受没有客户端证书的连接(然后服务器将检查SSLSession的对等证书以查看是否有证书)。setNeedClientAuth(true)当客户端不提供证书时会中断连接。

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

Java:如何添加SSL客户端身份验证 的相关文章

  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 为什么HashMap不能保证map的顺序随着时间的推移保持不变

    我在这里阅读有关 Hashmap 和 Hashtable 之间的区别 http javarevisited blogspot sg 2010 10 difference Between hashmap and html http javar
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐

  • 如何通过代码获取python模块的版本号? [复制]

    这个问题在这里已经有答案了 我正在尝试获取我使用的特定几个模块的版本号 我可以将一些东西存储在变量中 Use pkg 资源 http setuptools readthedocs io en latest pkg resources htm
  • 何时使用基于 ES6 类的 React 组件与函数式 ES6 React 组件?

    在花了一些时间学习 React 之后 我了解了创建组件的两种主要范例之间的区别 我的问题是我什么时候应该使用哪一个以及为什么 一种相对于另一种的优点 权衡是什么 ES6 类 import React Component from react
  • 在Kafka集群中添加新的ZooKeeper节点?

    我正在运行一个包含五个节点的 Apache Kafka 集群 并且正在使用一个包含三个节点的 Apache ZooKeeper 集群 在zookeeper properties文件中 server 1 zNode01 2888 3888 s
  • 在实体框架中保存断开连接的对象4

    在 EF1 中 我不能只更新在 ObjectContext 范围之外构造的对象 使用正确的 id EF4有新方法吗 我可以将其添加到上下文中吗 context AddOrder order 其中 context 是我的 ObjectCont
  • 单击时显示微调器

    我构建了一个微调器并使用 CSS 对其进行了动画处理 现在我尝试隐藏微调器并在单击按钮时显示它 到目前为止 我已经编写了这段代码 当我单击提交时它没有显示
  • 应如何使用基于类的视图动态设置模板名称?

    我已经搜索了基于类的视图 Django 文档 Django 1 4 的参考和主题 但我没有找到任何提及这一点的内容 如何使用基于类的视图动态设置模板名称 我正在寻找以下设置的基于类的等效项 urls py from django conf
  • 滚动选项卡时工具栏淡入淡出(代号一)

    Codename One 手册中的 如何在滚动时淡出工具栏 部分描述了如何在滚动时淡出工具栏标题动画 https www codenameone com manual components html title animations sec
  • Django REST 框架:动态序列化器关系字段 - POST pk 但 GET 超链接

    在我的模型中 我有 州 和 国家 一个国家可以有多个州 PK 1 的 HTTP GET 状态 id 1 url http test com states 1 name Ohio country http test com countries
  • 不含状态栏、操作栏和选项卡的屏幕高度

    我有一个 ListView 我希望每一行填充可用屏幕的三分之一 我有可见的状态栏 然后有一个带有滑动选项卡的操作栏 我正在做这样的当前计算 height context getResources getDisplayMetrics heig
  • Bash 真实的数字顺序

    如何按真实的数字顺序对目录中的文件进行排序 file1 txt file2 txt file11 txt 我认为它的名字是 自然秩序 Use the v option ls v file file1 file2 file11 file12
  • 在 R 中从列表转换为 data.frame 时,utf-8 字符会丢失

    我在 Windows 7 64 位上使用 R 3 2 0 和 RStudio 0 98 1103 我的电脑的Windows 区域和语言设置 是英语 美国 由于某种原因 以下代码将文本 Kory any nad p ehradou 中的捷克语
  • 使用 Selenium Webdriver 测试 sessionStorage

    我正在编写基于 Java 的 selenium webdriver 测试 我正在测试的应用程序在 storageSession 中设置了某些值 例如sessionStorage setItem demo test 如何检查并断言存储变量的值
  • 引用 x64 dll 文件在 C# 中有效,但在 F# 中无效

    我使用最新的 VS 2010 创建了两个全新的解决方案 C 控制台应用程序 F 控制台应用程序 我引用了两个x64 dll文件 Kitware VTK dll and Kitware mummy Runtime dll 可以在这里下载 ht
  • 如何使用 OR 和汇总函数构建高级 Hibernate 查询

    我有一个在 SQL 中运行的相当复杂的查询 但为了可移植性 我想用 HQL 来表达它 我将获取用户配置的首选项值 如果存在 如果不存在 我必须使用默认值 必须从当前日期中减去该值 并将其与我感兴趣的表中的列进行匹配 select d id
  • 使用 gdb 加载 ctypes 的调试库

    我在 python 中加载了一个 C 库 X so 并使用这些标志进行了编译 GDBFLAGS gdwarf 2 g3 O0 ggdb 我使用 ctypes 从 python 调用它的一些非静态函数 我希望调试 C 库 X so X so
  • 如何在不提交的情况下触发 ASP.NET 客户端验证?

    我有一个 ASP NET 网站 WebForms NOTMVC 其中有一个分为几张幻灯片的调查表 每张幻灯片都有一个下一个按钮 显然可以转换 客户端 而不是回发或远程请求 到下一张幻灯片 在每张幻灯片中 我都有几个 ASP NET 控件及其
  • 当 HTML5 音频是静态文件时,iOS 中的 HTML5 音频会显示“直播”

    对于 Windows Chrome 可能还有许多其他浏览器 此代码适用于在audio元素 param string filename return Illuminate Http Response Illuminate Contracts
  • AFNetworking 库在 iOS 7 中失败

    使用新的 iOS 7 Beta 并下载最新版本的 AFNetworking 我转到 文件 gt 将文件添加到项目 并传入目录 AFNetworking framework 现在我遇到了大量链接器错误 为了进行完整性检查 我将提交历史记录回滚
  • Python Selenium Webdriver:查找#document 元素

    我一直在使用 Python 的 Selenium Webdriver 通过此 HTML 代码获取元素 但是 我无法访问此 document 标记内的任何元素 我都用过driver find element by xpath html bod
  • Java:如何添加SSL客户端身份验证

    我有以下代码使用 SSL 连接服务器与客户端 现在我想添加客户端身份验证 我有一个服务器密钥库 JCEKS 类型 和一个客户端密钥库 JKS 类型 服务器使用信任库 cacerts 我在其中导入了两个证书 因为我也想使用此信任库进行客户端身