iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >利用Java实现mTLS调用
  • 667
分享到

利用Java实现mTLS调用

2024-04-02 19:04:59 667人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录本文将使用 Java作为客户端 与受 mTLS 保护的服务交互。 为了对我们的 Java 客户端进行 ssl 配置,我们需要先设置一个 SSLContext。这简化了事情,因为

本文将使用 Java作为客户端 与受 mTLS 保护的服务交互。

为了对我们的 Java 客户端进行 ssl 配置,我们需要先设置一个 SSLContext。这简化了事情,因为 SSLContext 可用于各种 Http 客户端。

由于我们有客户端公钥和私钥,我们需要将私钥从 PEM 格式转换为 DER。


openssl pkcs8 -topk8 -infORM PEM -outform PEM -in /path/to/generated/client.key -out /path/to/generated/client.key.pkcs8 -nocrypt

下一步是将客户端密钥加载到 Java 代码中并创建一个 KeyManagerFactory:


String privateKeyPath = <font>"/path/to/generated/client.key.pkcs8"</font><font>;
String publicKeyPath = </font><font>"/path/to/generated/client.crt"</font><font>;
 
<b>final</b> byte[] publicData = Files.readAllBytes(Path.of(publicKeyPath));
<b>final</b> byte[] privateData = Files.readAllBytes(Path.of(privateKeyPath));
 
String privateString = <b>new</b> String(privateData, Charset.defaultCharset())
        .replace(</font><font>"-----BEGIN PRIVATE KEY-----"</font><font>, </font><font>""</font><font>)
        .replaceAll(System.lineSeparator(), </font><font>""</font><font>)
        .replace(</font><font>"-----END PRIVATE KEY-----"</font><font>, </font><font>""</font><font>);
 
byte[] encoded = Base64.getDecoder().decode(privateString);
 
<b>final</b> CertificateFactory certificateFactory = CertificateFactory.getInstance(</font><font>"X.509"</font><font>);
<b>final</b> Collection<? <b>extends</b> Certificate> chain = certificateFactory.generateCertificates(
        <b>new</b> ByteArrayInputStream(publicData));
 
Key key = KeyFactory.getInstance(</font><font>"RSA"</font><font>).generatePrivate(<b>new</b> PKCS8EncodedKeySpec(encoded));
 
KeyStore clienTKEyStore = KeyStore.getInstance(</font><font>"jks"</font><font>);
<b>final</b> <b>char</b>[] pwdChars = </font><font>"test"</font><font>.toCharArray();
clientKeyStore.load(<b>null</b>, <b>null</b>);
clientKeyStore.setKeyEntry(</font><font>"test"</font><font>, key, pwdChars, chain.toArray(<b>new</b> Certificate[0]));
 
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(</font><font>"SunX509"</font><font>);
keyManagerFactory.init(clientKeyStore, pwdChars);

在上面的片段中

  • 我们从文件中读取字节。
  • 我们从公钥创建了一个证书链。
  • 我们使用私钥创建了一个密钥实例。
  • 使用链和密钥创建了一个密钥库
  • 创建了一个 KeyManagerFactory

现在我们已经创建了一个 KeyManagerFactory 我们可以使用它来创建一个 SSLContext

由于使用自签名证书,我们需要使用接受它们的 TrustManager。在此示例中,信任管理器将接受服务器提供的所有证书。


TrustManager[] acceptAllTrustManager = {
                <b>new</b> X509TrustManager() {
                    <b>public</b> X509Certificate[] getAcceptedIssuers() {
                        <b>return</b> <b>new</b> X509Certificate[0];
                    }
 
                    <b>public</b> <b>void</b> checkClientTrusted(
                            X509Certificate[] certs, String authType) {
                    }
 
                    <b>public</b> <b>void</b> checkServerTrusted(
                            X509Certificate[] certs, String authType) {
                    }
                }
        };

然后ssl上下文初始化。


SSLContext sslContext = SSLContext.getInstance(<font>"TLS"</font><font>);
sslContext.init(keyManagerFactory.getKeyManagers(), acceptAllTrustManager, <b>new</b> java.security.SecureRandom());


客户端代码:


HttpClient client = HttpClient.newBuilder()
                                     .sslContext(sslContext)
                                     .build();
 
 
 
       HttpRequest exactRequest = HttpRequest.newBuilder()
                                     .uri(URI.create(<font>"https://127.0.0.1"</font><font>))
                                     .GET()
                                     .build();
 
       <b>var</b> exactResponse = client.sendAsync(exactRequest, HttpResponse.BodyHandlers.ofString())
                                 .join();
       System.out.println(exactResponse.statusCode());


我们将收到一个 404 代码,这意味着我们的请求成功进行了 mTLS 握手。

注意:如果服务器端是使用本地 Nginx 服务,我们需要禁用主机名验证。


<b>final</b> Properties props = System.getProperties();
props.setProperty(<font>"jdk.internal.httpclient.disableHostnameVerification"</font><font>, Boolean.TRUE.toString());


在其他客户端中,这可能需要设置一个接受所有连接的 HostVerifier


HostnameVerifier allHostsValid = <b>new</b> HostnameVerifier() {
    <b>public</b> <b>boolean</b> verify(String hostname, SSLSession session) {
        <b>return</b> <b>true</b>;
    }
};

到此这篇关于利用Java实现mTLS调用的文章就介绍到这了,更多相关Java实现mTLS调用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 利用Java实现mTLS调用

本文链接: https://www.lsjlt.com/news/156403.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 利用Java实现mTLS调用
    目录本文将使用 Java作为客户端 与受 mTLS 保护的服务交互。 为了对我们的 Java 客户端进行 ssl 配置,我们需要先设置一个 SSLContext。这简化了事情,因为 ...
    99+
    2024-04-02
  • 利用Java实现调用http请求
    目录一、概述二、 Java调用第三方http接口的方式2.1、通过JDK网络类Java.net.HttpURLConnection2.2 通过apache common封装好的Htt...
    99+
    2024-04-02
  • 怎么在java中利用反射实现获取和调用功能
    怎么在java中利用反射实现获取和调用功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Class类中获取方法:public Method[] getMetho...
    99+
    2023-05-30
    java
  • 利用Java实现红黑树
    目录1、红黑树的属性2、旋转3、插入4、删除5、所有代码6、演示1、红黑树的属性 红黑树是一种二分查找树,与普通的二分查找树不同的一点是,红黑树的每个节点都有一个颜色(color)属...
    99+
    2024-04-02
  • Java利用JavaCPP调用算法示例
    目录配置liunx 环境系统配置java 项目配置liunx 环境系统 配置so 文件存放路径 [root@arch2 ~]# cat /etc/ld.so.conf.d/so...
    99+
    2024-04-02
  • Java调用Zookeeper的实现步骤
    目录watch机制常用APIJAVA调用watch机制 Zookeeper watch是一种监听通知机制,可以随时监听一些数据的变化,从而实现数据的及时性。 Zookeeper所有的...
    99+
    2024-04-02
  • java异步调用怎么实现
    在Java中,可以通过多线程、回调接口、Future和CompletableFuture等方式来实现异步调用。1. 多线程:创建一个...
    99+
    2023-09-16
    java
  • C#中怎么利用委托实现异步调用
    这篇文章将为大家详细讲解有关C#中怎么利用委托实现异步调用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。委托实现C#异步调用的步骤:定义委托。将要进行异步调用的方法“实例化”到定义的委托。在...
    99+
    2023-06-17
  • Java如何实现方法调用
    这篇文章给大家分享的是有关Java如何实现方法调用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。  Java的方法调用方法(method)的定义:  1 在java中程序员可以把在一个程序中多...
    99+
    2023-06-03
  • 如何利用PDB实现Python程序调试
    本篇内容介绍了“如何利用PDB实现Python程序调试”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!如何进行Python程序调试 1.加入断...
    99+
    2023-06-17
  • Java调用ChatGPT的实现代码
    目录Java调用ChatGPT的小插件1. ChatGPT账号准备2. 配置阶段2.1 依赖引入2.2 配置application.yml文件2.3 @EnableChatGPT注解...
    99+
    2023-02-18
    Java调用ChatGPT Java实现调用ChatGPT
  • java怎么实现异步调用
    在Java中,可以使用多种方法实现异步调用,下面列举了其中的两种常用方式: 使用线程池:可以使用Java中的`ExecutorSe...
    99+
    2023-10-25
    java
  • 利用java如何调用存储过程
    本篇文章给大家分享的是有关利用java如何调用存储过程,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。详解java调用存储过程并封装成map   &...
    99+
    2023-05-31
    java ava
  • 利用Redis实现分布式任务调度
    利用Redis实现分布式任务调度随着业务的扩展和系统的发展,很多业务都需要实现分布式任务调度,以确保任务能够在多个节点上同时执行,从而提高系统的稳定性和可用性。而Redis作为一款高性能的内存数据存储产品,具备分布式、高可用、高性能等特点,...
    99+
    2023-11-07
    分布式 redis 任务调度
  • 利用Vue3实现一个可以用js调用的组件
    目录前言一、常规Vue组件1. 组件主要代码:2. 使用方式3. 实现效果二、改为js调用组件1. 实现步骤:2. 具体实现代码:3. 实现效果展示总结前言 项目开发中基本都会用到...
    99+
    2024-04-02
  • python利用opencv调用摄像头实现目标检测
    目录使用到的库实现思路实现代码2020/4/26更新:FPS计算FPS记录的原理FPS实现代码使用到的库 好多人都想了解一下如何对摄像头进行调用,然后进行目标检测,于是我做了这个小B...
    99+
    2024-04-02
  • Java利用Guava Retry实现重处理
    目录一、pom依赖二、使用示例三、重试时机1. 根据异常进行重试2. 根据返回结果进行重试四、停止重试策略StopStrategy1. NeverStopStrategy2. Sto...
    99+
    2024-04-02
  • Java中如何实现异步调用
    Java中如何实现异步调用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。@Test一、创建线程public void test0() throws...
    99+
    2023-06-02
  • 怎么用Java实现回调例程
    小编给大家分享一下怎么用Java实现回调例程,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!熟悉 MS-windows 和 X Window System 事件驱动...
    99+
    2023-06-03
  • Spring Data 利用JPA如何实现调用存储过程
    这篇文章给大家介绍Spring Data 利用JPA如何实现调用存储过程,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。JPA连接到数据库,调用存储过程,这样的需求很常见。本文就针对这一点,讲述如何使用spring Da...
    99+
    2023-05-31
    jpa spring 存储过程
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作