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客户端身份验证 的相关文章

  • 使用 REST API 实现属性/字段级安全

    我正在为支持多租户授权模型的 REST API 构建概念验证 该模型不仅控制用户可以访问哪些对象 还控制对象中的字段 此模型的目标是确保租户管理员只能修改其租户并且只能查看允许的对象属性 我有一个正在开发的现有代码库 可在以下位置公开获取
  • 文件写入器覆盖文件而不是附加到末尾时出现问题

    好的 我在将多行写入文本文件时遇到一些问题 程序运行 但不会每次都使用新行 当我希望它运行 4 次时 文本文件应如下所示 a b c d 相反 它看起来像 d 谁知道如何解决这个问题 所有导入均正确导入 来源 已稍加编辑 假设一切都已正确定
  • @Nullable 和 SonarQube “有条件执行的块应该可达”警告

    包有以下package info java ParametersAreNonnullByDefault package foo import javax annotation ParametersAreNonnullByDefault 类有
  • Zuul不转发请求到其他微服务

    我正在使用 Spring Boot 微服务 我已经配置了 eureka zuul 代理和另一个微服务 帐户 如果我直接从帐户拨打电话 则工作正常 帐户和 zuul 服务器都显示在 eureka 上 当我尝试使用 zuul 代理进行访问时 它
  • Android 版 Qt 和 BoringSSL

    我正在开发一个基于 Qt 的 Android 应用程序 它使用 QSslSocket 下载数据 由于 Android 从 OpenSSL 转向 BoringSSL 因为依赖 OpenSSL 库的 Marshmallow Qt 程序在 And
  • Java 扫描仪问题 (JFrame)

    我正在尝试使用扫描仪来编辑塔防游戏的级别 但是 它不会将级别 图块图像 更新为自定义文件的级别 0 是草 1 是石头 1 是什么都没有 等等 我发现了错误 但如何修复它 我需要添加 更改什么才能消除这个错误 java lang NullPo
  • 涉及数学的方法给出与计算器不同的答案

    我是java新手 所以请耐心等待 我试图从比赛总数中获得胜利的百分比 但我正在做的事情还很遥远 我获取百分比的方法如下 public double winPercentage int wins int total return wins t
  • Java泛型类型要么扩展要么是父类

    我正在寻找一些如下所示的代码 public class Parent
  • Android - 检测电容式触摸屏上的触摸压力?

    我听说过 MotionEvent e float press e getPressure 但这只会在没有触摸时返回 0 当我的手指触摸屏幕时返回 1 是否可以找到手指在触摸电容屏上施加的压力值 或者我的预感是否正确 即这只适用于电阻屏幕 M
  • 可以使用注解进行代码注入吗?

    我意识到这可能是一个已经被提出和回答的问题 但请耐心等待 我想知道是否可以使用注释将代码注入到类编译时 典型的示例是为对象的成员生成 getter 和 setter 这并不完全是我所需要的 但它可以说明基本思想 现在在互联网上我得到的基本答
  • Gradle中的build-by-convention深度解释是什么?

    The 摇篮用户指南 http www gradle org docs current userguide userguide html经常提到 Gradle 是陈述性的和用途按惯例构建 这是什么意思 据我了解 这意味着 例如 在java插
  • 我在 Android Studio 中使用哪个版本的 JDK 有关系吗?

    I know I can choose the SDK location in Android Studio s Project Structure 我有两个问题 当我们已经使用Android SDK时 为什么还需要JDK 毕竟我们不是为
  • CreationException:无法在 Play 2.5.18 中创建注入器错误,以使用 com.google.inject.AbstractModule 替换 GlobalSettings Java 代码

    我正在将 Play 应用程序从 2 5 12 升级到 2 5 18 当我启动该应用程序时 使用sbt 我收到此错误 CreationException 无法创建注入器 看到以下错误 1 Error injecting constructor
  • 使用 Windows 锁定屏幕后删除 Kerberos 缓存票证

    无论如何 有没有办法阻止 Kerberos 缓存的票证在 Windows 进入锁定屏幕后被删除 首次登录 Windows 时 klist exe 显示 2 个缓存票证 但是 发生 Windows 锁屏事件后 klist exe 显示 0 个
  • Java setLocation() 事故

    我正处于创建一个程序来操作员工 客户系统的开始阶段 现在我刚刚创建了登录 GUI 但我遇到了一些问题 setLocation 方法 我将其设置为 250 250 但这使我的 GUI 高度变得非常疯狂 如果有人能够解决这个问题 我的代码如下
  • Java检测音频文件(mp3)

    我有这段代码可以读取 mp3 文件 import java io File import java io IOException import javax sound sampled AudioSystem import javax sou
  • 解析XML文件以获取所有命名空间信息

    我希望能够从给定的 XML 文件中获取所有名称空间信息 例如 如果输入 XML 文件类似于
  • Spring MVC 和复选框

    我正在使用 Spring MVC 3 0 并且不能完全看到这个问题的所有部分 我的控制器将生成一个域对象列表 假设有一个简单的 User 对象 具有firstName lastName age 和role 属性 我想在表中输出该用户列表 每
  • Nitrous.IO 上的 HTTPS (TLS/SSL) 服务器

    请问如何在 Nitrous IO Boxes 上创建 TLS 服务器 我认为我至少必须获得 cert pem 和 key pem 或类似的东西 根据您所在的区域 您可以自动获得 SSL 身份验证 这样就够了吗 http help nitro
  • 应用程序中 GC 长时间暂停

    我当前运行的应用程序需要最大堆大小为 16GB 目前我使用以下标志来处理垃圾收集 XX UseParNewGC XX UseConcMarkSweepGC XX CMSInitiatingOccupancyFraction 50 XX Di

随机推荐

  • 如何通过代码获取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 我在其中导入了两个证书 因为我也想使用此信任库进行客户端身