相互问题

HTTPS协议是用于确保我们的连接安全的公认标准。 理解此协议的工作原理不是问题,并且从2000年起可以使用相应的RFC文档 。

尽管HTTPS的使用如此广泛,但您仍然可以找到一种无需不必要的复杂性就无法处理此协议的软件。 不幸的是,在使用该语言进行相互身份验证的过程中遇到了问题,这一点都不会让我感到惊讶。 它是Java

HTTPS如何工作?

在描述实现过程中遇到的问题之前,我将描述相互认证的工作原理。 HTTPS协议使用TLS / SSL协议来保护连接。 TLS / SSL协议定义了身份验证握手,该握手允许以安全方式将任何客户端与服务器连接。 在握手过程中,执行以下步骤:

  • 客户端发送消息以启动连接。
  • 服务器将其证书发送给客户端。
  • 客户端使用由可信机构颁发的证书来验证证书。
  • 服务器发送对客户端证书的请求。
  • 客户端将其证书发送到服务器。
  • 服务器验证客户端的证书。
  • 服务器和客户端交换在数据加密期间使用的主密钥。
  • 建立连接。

我们和队友一起尝试用Java实现HTTPS客户端。 结合我们对TLS / SSL握手的了解以及对curl进行手动测试的经验,我们假设实现客户端只需要三个文件: 一个客户端的证书一个客户端的私钥一个用于验证服务器证书的受信任证书

哦,我们这么认为是多么错误。

Java –问题,解决方案以及为什么如此困难

由于每天使用相互身份验证是很不常见的,因此我们要求世界上最好的消息来源提供少量帮助。 初看Google叔叔提供的结果并没有揭示实现背后的复杂性,但是每次点击结果都使我们找到了越来越混乱的解决方案(其中一些来自90年代)。 更糟的是,我们不得不使用Apache HttpComponents来实现我们的连接,但是大多数提议的解决方案都基于纯Java库。

来自互联网的知识使我们能够确定:

  • Java不能直接使用任何证书或私钥(例如curl
  • Java需要单独的文件( Java Keystores ),其中可以包含原始证书和密钥。
  • 我们需要一个受信任的密钥库,其中包含每个HTTPS连接的服务器证书验证所需的证书。
  • 我们需要一个密钥密钥库,其中包含客户端的证书和客户端的私钥以进行相互认证。

首先,我们必须创建受信任的密钥库。 我们使用keytool命令使用证书创建了密钥库:

$ keytool -import -alias trusted_certificate -keystore trusted.jks -file trusted.crt

我们将证书trusted.crt存储在密钥库文件trusted.jks中,别名为trusted_certificate 。 在执行此命令期间,要求我们输入此密钥库的密码。 我们稍后使用此密码来访问密钥库文件。

要创建密钥库,需要执行一些其他步骤。 在大多数情况下,您可能会从公司获得两个文件,这些文件会颁发客户的证书。 第一个文件将是pem格式的客户证书。 该证书将被发送到服务器。 第二个文件是客户端的私钥(也是pem格式),在握手期间使用该私钥来确认您是客户端证书的所有者。

不幸的是, Java仅支持PKCS12格式。 因此,我们必须将我们的证书和私钥转换为PKCS12格式。 我们可以使用OpenSSL做到这一点。

$ openssl pkcs12 -export \-in client.crt \-inkey client.key \-out key.p12 \-name client

我们从文件client.crtclient.key生成了文件key.p12 。 再次需要输入密码。 该密码用于保护私钥。

通过将PKCS12导入新的密钥库,我们可以从PKCS12格式的文件中生成另一个密钥库:

$ keytool -importkeystore \-destkeystore key.jks \-deststorepass <<keystore_password>> \-destkeypass <<key_password_in_keystore>> \-alias client \-srckeystore key.p12 \-srcstoretype PKCS12 \-srcstorepass <<original_password_of_PKCS12_file>>

这个命令看起来有点复杂,但是解密起来却很容易。 在命令的开头,我们声明名为key.jks的新密钥库的参数。 我们定义了密钥库的密码和此密钥库将使用的私钥的密码。 我们还将私钥分配给密钥库中的某些别名(在本例中为client )。 接下来,我们指定源文件( key.p12 ),该文件的格式和原始密码。

使用trusted.jkskey.jks我们已经准备好进行编码。 在第一步中,我们必须描述我们如何使用密钥库。

File trustedKeystoreFile = new File("trusted.jks");
File keystoreFile = new File("key.jks");SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(trustedKeystoreFile, "<<trusted_keystore_password>>".toCharArray()).loadKeyMaterial(keystoreFile, "<<keystore_password>>".toCharArray(), "<<original_password_of_PKCS12_file>>".toCharArray()).build();SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslcontext,new String[]{"TLSv1.2"},null,SSLConnectionSocketFactory.getDefaultHostnameVerifier());

我们获取了密钥库文件,并构建了SSL上下文。 接下来,我们创建了套接字工厂,该套接字工厂为我们的请求提供了正确的HTTPS连接。

最后,我们可以从Java调用端点:

try (CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build()) {HttpGet httpGet = new HttpGet("https://ourserver.com/our/endpoint");try (CloseableHttpResponse response = httpclient.execute(httGet)) {HttpEntity entity = response.getEntity();System.out.println(response.getStatusLine());EntityUtils.consume(entity);}
}

做完了 在创建了两个额外的文件(密钥库)之后,这些文件等效于我们的原始证书和私钥,我们使用Java实现了相互身份验证 。 用Java实现HTTPS连接也许有一定道理,但是现在这只是一个头痛的事情。

翻译自: https://www.javacodegeeks.com/2016/03/mutual-problems-2.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

八个使前端工程师惊艳的效果设计,码否?

我们都知道掌握编程技术是一项很难的事情&#xff0c;没有捷径可走。需要我们在日复一日的工作中去锻炼。如果想要达到擅长甚至需要长年累月的积累。 下面列举了一些可以给你带来编码灵感的例子&#xff0c;相信你看到会有想去写代码的冲动。 因为一个好的工程师&#xff0c;…

OpenStack_I版 1.准备过程

openstack是一个开源云平台&#xff0c;python开发此次部署为实验环境&#xff0c; 采用扁平化简单的网络架构部署  优点&#xff1a;低耦合的&#xff0c;模块化Nova 计算资源池Glance 镜像服务Swift 对象存储Horizon 对计算资源&#xff0c;网络资源起别…

使用React和Tailwind CSS搭建项目框架

众所周知&#xff0c;Tailwind CSS框架越来越流行&#xff0c;所以我决定尝试学习并使用Tailwind CSS来搭建一个项目模板&#xff0c;一方面自己深入学习下&#xff0c;二来帮助新人更快地上手Tailwind CSS开发。 创建一个React项目 通过使用create-react-app命令创建一个新的…

快点,再快点!

现在看视频不来个两倍速&#xff08;或者更快&#xff09;都觉得在浪费生命。特别是在看视频教程的时候&#xff0c;文字我们可以做到一目十行&#xff0c;但是视频呢&#xff0c;如果有字幕&#xff0c;我们甚至不用听清&#xff0c;用3倍速或者4倍速完全没有问题&#xff0c;…

jetty eclipse_3个步骤实现Jetty和Eclipse集成

jetty eclipse本教程将引导您逐步了解如何集成Jetty和Eclipse&#xff0c;以及如何在Eclipse中的Jetty服务器上运行Web应用程序。 脚步&#xff1a; 安装Jetty Eclipse插件 建立网路应用程式 运行网络应用 1 –安装Jetty Eclipse插件 将服务器添加到“服务器”视图时&…

01jquey基础

1.html代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>无标题文档</title> <script type"text/javascript" src"jquery-3.2.1.min.js"></script> <script type"tex…

使用React和Tailwind CSS搭建项目模板

公众号关注 “太空编程”设为 “星标”&#xff0c;带你了解硬核的编程知识&#xff01;众所周知&#xff0c;Tailwind CSS框架越来越流行&#xff0c;所以我决定尝试学习并使用Tailwind CSS来搭建一个项目模板&#xff0c;一方面自己深入学习下&#xff0c;二来帮助新人更快地…

Java用Java编译

在上一篇文章中&#xff0c;我写了关于如何在运行时生成代理的信息&#xff0c;我们已经了解到生成Java源代码的程度。 但是&#xff0c;要使用该类&#xff0c;必须对其进行编译&#xff0c;并将生成的字节码加载到内存中。 那是“编译”时间。 幸运的是&#xff0c;从Java 1.…

PHP实现前台页面与MySQL的数据绑定、同步更新

今天我来给大家介绍一个PHP-MySQL的小项目。 使用 PHP和前台Ajax 实现在前台对MySQL数据库中数据的增、删等操作语句功能。 如果有问题&#xff0c;欢迎拍砖~ 有不懂的地方&#xff0c;提出来咱们一起探讨~ 首先&#xff0c;我们先做好前台HTML、CSS样式&#xff0c;代码如下&a…

如何用Vue实现简易的富文本编辑器,并支持Markdown语法

前端开发经常会用到富文本编辑器&#xff0c;比如CKEditor&#xff0c;动不动一个库几十M的代码量&#xff0c;其中涉及许多你可能用不到的功能特性和相关设置&#xff0c;CKEditor最新版本的代码仓库就有接近2000个JS文件&#xff0c;300,000行代码。 可是如果你只需要一个简…

互联网基建成果,快速实现一个clubhouse要多久

最近国外的一款基于语音的社交软件clubhouse掀起了一股热潮&#xff0c;尤其是在Eleon Musk的带动下&#xff0c;整个互联网圈内人都在第一时间抢先体验。不管它为什么会火&#xff0c;肯定不是技术上有什么特别的优势。随着整个互联网技术生态的不断发展&#xff0c;互联网基础…

阿里帝国到底有多庞大

马云&#xff0c;男&#xff0c;1964年9月10日生于浙江省杭州市&#xff0c;祖籍浙江省嵊州市谷来镇&#xff0c; 阿里巴巴集团主要创始人&#xff0c;现担任阿里巴巴集团董事局主席、日本软银董事、TNC中国理事会主席兼全球董事会成员、华谊兄弟董事、生命科学突破奖基金会董事…

resteasy 统一异常_RESTEasy教程第3部分:异常处理

resteasy 统一异常在开发软件应用程序时&#xff0c;异常处理是显而易见的要求。 如果在处理用户请求时发生任何错误&#xff0c;我们应该向用户显示一个错误页面&#xff0c;其中包含详细的异常消息&#xff0c;错误代码&#xff08;可选&#xff09;&#xff0c;更正输入和重…

哪些网站在+1s后有神奇的功能

1s 有些网站&#xff0c;当我们给它 1s 时&#xff0c;会有意想不到的奇效。 github 1s 在 GitHub 域名后面加 1s 可以直接使用 vscode online 打开仓库代码&#xff0c;例如 https://github1s.com/fantingsheng/front-end https://github1s.com/fantingsheng/front-end^^ …

如何搭建一个内部组件共享平台

如今前端越来越趋于组件化的开发方式&#xff0c;最大的益处就是UI页面和逻辑的共用。在开发者的眼里&#xff0c;如果你打开一个网站&#xff0c;组件化的开发方式会让你看起来像这个样子&#xff1a;逻辑功能上我们会封装成一个库&#xff0c;然后NPM发布到公共仓库上&#x…

标准C程序设计七---46

Linux应用 编程深入 语言编程标准C程序设计七---经典C11程序设计 以下内容为阅读&#xff1a; 《标准C程序设计》&#xff08;第7版&#xff09; 作者&#xff1a;E. Balagurusamy&#xff08;印&#xff09;&#xff0c; 李周芳译 清华大学出版社…

不要讨厌HATEOAS

或我如何学会不再担心和爱HATEOAS REST已成为实现Web服务的事实上的解决方案&#xff0c;至少已成为一种流行的解决方案。 这是可以理解的&#xff0c;因为REST在使用HTTP规范时提供了一定程度的自我文档。 它经久耐用&#xff0c;可扩展&#xff0c;并提供了其他一些理想的特…

前端如何进行日志驱动开发

日志在开发过程中的作用自不必说&#xff0c;一旦程序出现问题&#xff0c;我们首先想到的是通过日志监控去追查。 好的日志可以通过应用程序执行的历史记录模拟出用户在使用程序的时候操作的完整过程。 想知道发生了什么 为了便于我们分析程序哪里出现问题&#xff0c;我们…

消息钩子学习工程

前奏近来一直在自学Windows Hook相关的知识&#xff0c;已经尝试多种注入方式。尤其对消息钩子方式很感兴趣&#xff0c;因为看到Spy能够截获系统中绝大多数应用的消息流&#xff0c;就很想知道它的工作原理&#xff0c;打算制作属于自己的Spy。消息钩子简介&#xff1a;消息钩…

[Angular] 笔记 8:list/detail 页面以及@Input

1. list 页面 list/detail 是重要的 UI 设计模式。 vscode terminal 运行如下命令生成 detail 组件&#xff1a; PS D:\Angular\my-app> ng generate component pokemon-base/pokemon-detail --modulepokemon-base/pokemon-base.module.ts CREATE src/app/pokemon-base/p…