多个定时器相互干扰的问题

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

多个定时器相互干扰的问题

多个定时器相互干扰的问题_相互问题相关推荐

  1. 两个词之间的依存语义关系_相互依存的网络之间的级联中断-2003年停电的5个教训

    两个词之间的依存语义关系 In 2003, what should have been a local power outage resulted in 50 million people losin ...

  2. arduino定时器函数如何使用_【Arduino101教程】定时器的使用

    定时器中断 外部中断是通过检测输入电平的变化,而产生中断信号.除了外部中断方式外,Genuino 101还可以按时间变化产生中断,这里即会使用到定时器(Timer),而对应产生的中断被称为定时器中断. ...

  3. 用32定时器让电机缓慢转动_实验三 步进电机原理及应用

    本文使用 Zhihu On VSCode 创作并发布 姓名: 张 政 学号: 21180615 实验目的和要求 初步学习和掌握MCS-51的体系结构和汇编语言,了解Keil编程环境和程序下载工具的使用 ...

  4. 改变定时器获取传感器频度_广东梅州梅县压力传感器*校对

    广东梅州梅县压力传感器*校对 看门狗寄存器不会改变或改变不大,如果看门狗寄存器发生了改变或改变很大,则说明系统陷入"死循环".需要进行出错处理.在工业应用中,严重的干扰有时会破坏中 ...

  5. 改变定时器获取传感器频度_称重传感器在高速定量分装系统的应用

    高速定量分装系统由微机控制称重传感器的称重和比较,并输出控制信号,执行定值称量,控制外部给料系统的运转,实行自动称量和快速分装的任务. 系统采用MCS-51单片机和V/F电压频率变换器等电子器件,其硬 ...

  6. 滴答定时器的计数模式_【高手私藏】STM32学习笔记:SysTick滴答时钟

    今天我们来说说SysTick定时器.SysTick定时器在从参考手册中根本没有介绍.我费了九牛二虎之力才在一个犄角格拉里找到SysTick定时器的英文版的说明.在Cotex-M3有介绍,为什么要找ST ...

  7. drools规则引擎中易混淆语法分析_相互触发导致死循环分析

    整理了下最近在项目中使用drools出现的问题,幸好都在开发与测试阶段解决了,未波及到prod. 首先看这样两条规则: /*** 规则1_set默认利率a */ rule "rate_def ...

  8. python 循环定时器 timer显示数据_【Python】多线程、定时循环爬取优信二手车信息...

    爬虫 爬取优信二手车:循环遍历每页,获取相应的有价值字段信息,这里不详细阐释了. 多线程 Python中,使用concurrent.futures模块下的ThreadPoolExecutor类来实现线 ...

  9. 鼠标移入移出时定时器加速的原因_赛睿Rival 3 Wireless测评:实用出彩的无线鼠标...

    在选择鼠标等外设产品时,是否支持无线连接已经逐渐成为许多小伙伴们选购指标之一.毕竟随着无线技术的发展,无线外设产品的延迟表现逐渐能够媲美有线,而且少了线的束缚用起来也更加随心所欲.所以即使是在游戏外设 ...

最新文章

  1. 借条的注意事项,上面不能有这3个字
  2. 开发函数计算的正确姿势——轻松解决大依赖部署
  3. 头像裁剪_课堂裁剪|19级油画班油画头像写生作品
  4. JUC多线程:系统调用、进程、线程的上下文切换
  5. ThinkPHP--栏目增删改查ADSF
  6. vue --- cdn导入,一些基本操作
  7. php 按照laravel5.5,Laravel5.5 综合使用
  8. .NET Micro Framework 用户程序升级说明
  9. 英语作业(general version an narrow version about sth)
  10. 2017年5月24日--2018年5月26日
  11. gem5源码解读se.py以及simulate.py(一)
  12. 固态硬盘安装记录之数据二次迁移
  13. 反射的学习(参考尚硅谷视频)
  14. JAVA之ZIP、RAR解压工具类
  15. linux上windows模拟器下载,Wine(Windows模拟器)下载_Wine(Windows模拟器)官方下载-太平洋下载中心...
  16. NOI2015 小园丁与老司机
  17. AutoCAD.net: 如何实现裁剪功能--Trim
  18. 机器学习 入门详细解析(二)决策树、随机森林
  19. RFID信息系统数据安全对策分析
  20. Java用Jsoup开发爬虫获取双色球开奖信息

热门文章

  1. P1791-[国家集训队]人员雇佣【最大权闭合图】
  2. P6775-[NOI2020]制作菜品【贪心,dp】
  3. [2020.10.25NOIP模拟赛]序列【Splay】
  4. CF735D-Taxes【数学,数论】
  5. Hadoop入门(十八)Mapreduce的倒排索引程序
  6. JavaFX UI控件教程(十三)之Table View
  7. mybatis入门(三)之Mapper XML 文件
  8. require.ensure与require AMD的区别
  9. Java基于socket服务实现UDP协议的方法
  10. Oracle入门(十四C)之转换函数