java 验证码透明背景_Java中的证书透明度验证

java 验证码透明背景

因此,我有一个幼稚的想法,即除了证书有效性检查(在Java中)之外,将证书透明性验证作为每个请求的一部分也很容易。

牺牲了整个周末的一半时间,我可以证明这并不是一件小事。 但是, 证书透明性是什么? 简而言之,它是世界上所有TLS证书的公开日志(即使SSL已过时,仍称为SSL证书)。 您可以检查该日志中是否发布了日志,如果不发布,则有些可疑,因为CA必须将其所有已颁发的证书推送到日志中。 还有其他用例,例如,为您的域注册新证书的通知,以检测可能被劫持的DNS管理面板或CA( Facebook免费提供了这样的工具 )。

我想做的是前者–使来自Java应用程序的每个请求在证书透明性日志中验证对方的证书。 似乎这不是开箱即用的(如果可以,我找不到它。 在一次有关JEP 244的讨论中 ,似乎讨论了与证书透明性有关的TLS扩展,但是我找不到它是否是最终支持)。

我开始认为您可以简单地获取证书,然后通过证书的指纹检查其是否包含在日志中。 这太容易了-允许通过哈希检查的日志,但这不是证书的指纹,而是签名的证书时间戳-由日志在包含之前发布的签名。 引用CT RFC :


SCT(签名证书时间戳)是日志将证书合并到Merkle树中的承诺

merkle树是一种非常酷的数据结构,它通过提供比整个日志短得多的“包含证明”,使外部参与者确信该日志中包含某些内容(从而节省了大量带宽)。 实际上,默克尔树的凉爽是为什么我首先对证书透明性感兴趣的原因(因为我们在我当前的面向日志的公司中使用默克尔树)

因此,为了检查是否包含 ,您必须以某种方式获取SCT。 最初,我认为使用Certificate Transparency Java库是可能的,但事实并非如此。 拥有它之后,您可以使用客户端在日志中对其进行检查,但是获取它比较困难。 (注意:对于服务器端验证,可以通过HTTP查询日志; 但是浏览器可以使用DNS查询来保留用户的匿名性)。

可以通过三种方式来获得SCT,具体取决于服务器和/或日志和/或CA选择支持的方式:SCT可以包含在证书中,也可以在TLS握手期间作为TLS扩展提供。 ,也可以在握手期间再次包含在TLS装订响应中。 不幸的是,我检查的少数证书中没有存储SCT,因此我必须进入较低级别并调试TLS握手。

我启用了TLS hadnshake 冗长的输出 ,并且瞧瞧-那里什么都没有。 Google确实将SCT包含为TLS扩展(根据Qualys),但Java输出未对此进行任何说明。

幸运的是(?)Google发布了Conscrypt –一种基于Java的安全性提供程序,基于Google的OpenSSL分支。 事情开始变得一团糟……但我还是去了,包括Conscrypt并将其注册为安全提供程序。 我必须使用Conscrypt TrustManager建立连接(已使用JDK中的所有受信任证书初始化):

KeyStore trustStore = KeyStore.getInstance("JKS");
trustStore.load(new FileInputStream(System.getenv("JAVA_HOME") + "/lib/security/cacerts"), "changeit".toCharArray());
ctx.init(null,new TrustManager[] {new TrustManagerImpl(trustStore, null, null, null, logStore, null, new StrictCTPolicy())}, new SecureRandom());URL url = new URL("https://google.com");
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(ctx.getSocketFactory());
conn.connect();
conn.getInputStream();
conn.disconnect();

当然,它最初并不起作用,因为Conscrypt不提供某些核心接口(CTLogStore和CTPolicy类)的实现。 实际上,CTLogStore是保留有关所有已知日志信息的重要位(我仍然发现将“日志提供程序”简称为“ log”很奇怪,但这是公认的术语)。 有一个以JSON形式存在的已知日志列表 ,这很酷,只是花了我一段时间(在外部帮助下)才能弄清楚那些公钥到底是什么。 它们是什么-RSA,ECC? 它们如何编码? 您在RFC和文档中都找不到。 在这里可以看到它是“ SubjectPublicKeyInfo ASN.1结构的DER编码”。 啊。

BouncyCastle进行营救。 我与BouncyCastle的恋爱关系深深。 我讨厌它的直观性和API的复杂性,但是我喜欢它(几乎)具有您可能需要的所有与密码相关的东西。 在花费一些时间试图弄清楚如何将公共密钥转换为PublicKey对象之后,我发现使用PublicKeyFactory.createKey(Base64.getDecoder().decode(base64Key)); 为您提供使用任何算法的参数-它可以返回椭圆曲线关键参数或RSA关键参数。 您只需要将它们包装在另一个类中,然后将它们传递到另一个工厂(通常为BouncyCastle),就可以拥有公共密钥。

当然,现在Google的Conscrypt不再起作用,因为在转换之后,publicKey的编码版本与原始字节不相同,因此日志ID计算错误。 但是我经过一番思考后解决了这个问题,最后,它奏效了–查询了证书透明性日志,并证明该证书有效并且正确地包含在日志中。

整个代码可以在这里找到 。 是的,它使用了多个安全提供程序,一些奇怪的BouncyCastle API和Google提供程序中缺少的一些简单实现。 可能会缓存已知的证书,以便不执行对日志的重复调用,但这超出了我的实验范围。

证书透明性似乎是当今互联网的核心内容。 但是,它是如此晦涩且难以使用。

为什么列表中的公共密钥类型没有记录(它们至少应在公共密钥旁边放置一个OID,因为事实证明,并非所有日志都使用椭圆曲线-其中两个使用RSA)。 也许有一个很好的解释,但是为什么在日志中包括SCT而不是证书的指纹? 那么,为什么不要求在证书中包括SCT,而不需要将服务器和客户端包含在TLS握手中,而证书和证书又需要升级呢?

据我所知,由于数以百万计的Let's加密证书在那里,证书透明性倡议现在面临可伸缩性问题。 每个日志(提供者)都应将整个日志提供给所有请求它的人。 解决这不是一件容易的事,并且朝着这个方向努力了,但是目前还没有明显的解决方案。

最后,如果Java没有简便的方法来实现这一点,那么所有的加密库都可用,我想知道其他语言的情况如何。 他们支持证书透明性还是需要升级?

也许我们都很好,因为浏览器支持它,但是浏览器并不是发出HTTP请求的唯一对象。 API调用是一个巨大的用例,如果可以对其进行劫持,则所造成的损害甚至可能比被诱骗的单个用户还要大。 因此,我认为应该在两方面加大投入:
1.改进RFC和2.改进编程生态系统。 我希望这篇文章至少能有所贡献。

翻译自: https://www.javacodegeeks.com/2019/01/certificate-transparency-verification-java.html

java 验证码透明背景

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

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

相关文章

html ajax请求jsp,JSP+jquery使用ajax方式调用json的实现方法

本文实例讲述了JSPjQuery使用Ajax方式调用JSON的实现方法,在这里分享给大家以供大家参考,具体的实现以及代码如下所示:前台://testfunction test(uid){if(confirm("确定该用户操作"uid"吗?")){var…

ai背景合成_智能合成AI主播很危险,应立即取消!

邱震海分享我对时政问题的看法点击↑↑↑音频收听“倾听彼得 邱”音频背景每年两会,关注报道两会的记者多达3000多人,他们分布在会场内外及时捕捉两会动人瞬间和重要时刻,及时向全国乃至全球读者传递。但是今年的两会报道期间,新…

spring注入私有字段_Spring字段依赖注入示例

spring注入私有字段了解如何编写Spring Field Injection示例 。 字段注入是Spring框架 依赖注入的一种 。 在本教程中,我们将编写几个类,并看一看现场注入工程。 有关Spring依赖注入的更多信息: Spring Setter依赖注入示例 Spring构造函数…

简述html的3种列表uloldl,语义化HTML:ul、ol和dl

一、语义化元素1. ul标签W3C草案:The ul element represents an unordered list of items; that is, a list in which changing the order of the items would not change the meaning of list.语义化元素:表示包含一组无序列表项内容。在不同的浏览器默…

centos8 kernel source 安装_什么?你在物理机上安装Oracle总失败?那就试试Docker吧

写在前面有些小伙伴按照我写的《【Oracle】什么?作为DBA,你竟然不会安装Oracle??》一文,在CentOS 8.0服务器上来安装Oracle,总是说:安装不成功!但是我确实也是在CentOS 8.0服务器上安…

Maven的资源坐标

在 Maven 中&#xff0c;坐标是资源包的唯一标识&#xff0c;Maven 通过坐标在仓库中找到唯一的资源。 下面就是 javax.servlet-api-4.0.1.jar 的坐标&#xff1a; <dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</…

starter_您是否尝试过MicroProfile Starter?

starterhttps://start.spring.io的SPRING INITIALIZR已经存在了一段时间&#xff0c;并且是引导新的Spring Boot应用程序的最佳方法。 到目前为止&#xff0c;即使不同的供应商为其实施提供了启动器&#xff0c;也没有类似的方式来引导新的MicroProfile项目。 但是等待已经结束…

html2image乱码问题,HtmlImageGenerator字体乱码问题解决、html2image放linux上乱码问题解决...

使用html2image-0.9.jar生成图片。在本地window系统正常&#xff0c;放到服务器linux系统时候中文乱码问题。英文可以&#xff0c;中文乱码应该就是字体问题了。一、首先需要在linux安装字体&#xff0c;simsun.ttc simsun.ttf simsunb.ttf1、新建目录/user/share/fonts/chine…

java每个阶段的学习时间_每个Java学习者都会犯的10个最常见的1个错误

java每个阶段的学习时间据说&#xff1a;“您的朋友会吞下您的错误&#xff0c;您的敌人会将它们呈现在盘子上”。 我绝对不是你的敌人&#xff0c;但我想向您介绍一些针对每个Java初学者的错误&#xff0c;我将在此博客“标牌”上就此做错。 当然只有其中一些&#xff0c;我是…

高速信号传输约翰逊 pdf_高速数字电路仿真设计与测试技术发展趋势综述 (一)...

近十多年来&#xff0c;数字集成电路和各种接口总线标准的发展令人眼花缭乱&#xff0c;目不暇接。各个总线标准通常由不同团队制订&#xff0c;其纷繁芜杂的测试和测量技术给从业人员带来许多困扰。本文将就当下的一些主要接口总线标准的仿真设计与测试技术发展趋势作一些简明…

Maven的继承

文章目录什么是继承&#xff1f;如何实现继承&#xff1f;什么是继承&#xff1f; 在聚合多个项目时&#xff0c;如果这些被聚合的项目中需要引入相同的Jar&#xff0c;那么可以将这些Jar写入父pom中&#xff0c;各个子项目继承该pom即可。 如何实现继承&#xff1f; 父pom配…

八中计算机是学啥的,北京八中:居然有这么好玩的课

北京八中&#xff1a;居然有这么好玩的课中国青年报北京12月13日电(记者堵力)种种“稀奇古怪”的科技知识纳入了北京八中学生们的正式课程。每周&#xff0c;所有的学生都会面对各种仪器&#xff0c;学习电台、电脑&#xff0c;以及兵器装备的知识等等———12月13日上午9&…

@builder注解_SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证

一.说明SpringSecurity是一个用于Java 企业级应用程序的安全框架,主要包含用户认证和用户授权两个方面.相比较Shiro而言,Security功能更加的强大,它可以很容易地扩展以满足更多安全控制方面的需求,但也相对它的学习成本会更高,两种框架各有利弊.实际开发中还是要根据业务和项目…

web前端面试问答_Web服务面试问答

web前端面试问答在这篇文章中&#xff0c;我们涵盖了您需要熟悉的Web服务概念的几乎所有部分&#xff0c;以回答任何层级问题。 您还将在分类中找到最佳的Web服务面试问题和答案&#xff0c;因此只有在必要时才可以使用特定条款。 今天可以在各种编程平台上开发各种Web应用程序…

Maven项目的pom.xml文件详解

文章目录pom.xml文件解读标签 dependency 的解读pom.xml文件解读 <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0http://maven.…

u盘装系统学计算机好,教你如何使用u盘做系统

电脑对人们来说是了越来越重要了&#xff0c;怎么说呢&#xff0c;不论是在工作中&#xff0c;还是小孩的学习都需要使用电脑&#xff0c;所以说人们是越来越离不开对电脑的使用了。不过&#xff0c;电脑毕竟是电子产品&#xff0c;所以免不了会出现一些故障问题&#xff0c;比…

使用junit进行单元测试_使用JUnit对ADF应用程序进行单元测试

使用junit进行单元测试JUnit是Java语言的单元测试软件包&#xff0c;由于ADF构建在J2EE框架之上&#xff0c;因此可以用于测试Oracle ADF应用程序。 单元测试基本上是根据某些定义的测试标准来验证最小的可测试模块的过程。 在这里&#xff0c;我将说明如何在JDeveloper 12.2.1…

spring mvc是什么_狂神说SpringMVC01:什么是SpringMVC

狂神说SpringMVC系列连载课程&#xff0c;通俗易懂&#xff0c;基于Spring5版本(视频同步)&#xff0c;欢迎各位狂粉转发关注学习。未经作者授权&#xff0c;禁止转载1、回顾MVC1.1、什么是MVCMVC是模型(Model)、视图(View)、控制器(Controller)的简写&#xff0c;是一种软件设…

Maven的settings.xml范本(含资源仓库镜像配置)

文章目录一、settings.xml 范本二、资源仓库镜像一、settings.xml 范本 <?xml version"1.0" encoding"UTF-8"?> <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instanc…