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 验证码透明背景

java 验证码透明背景_Java中的证书透明度验证相关推荐

  1. Java中的证书透明度验证

    因此,我有一个幼稚的想法,即除了证书有效性检查(在Java中)之外,将证书透明性验证作为每个请求的一部分也很容易. 牺牲了整个周末的一半时间,我可以证明这并不是一件小事. 但是, 证书透明性是什么? ...

  2. java验证码实现简单_java实现简单的验证码功能

    最近要做一个网站,要求实现验证码程序,经过不断调试,终于成功实现功能. 一.验证码生成类 生成验证码的话需要用到java的Graphics类库,画出一个验证码 废话不多说,直接上代码 package ...

  3. java可以多重继承吗_Java中的多重继承与组合vs继承

    java可以多重继承吗 有时我写了几篇有关Java继承,接口和组成的文章. 在这篇文章中,我们将研究多重继承,然后了解组成优于继承的好处. Java中的多重继承 多重继承是创建具有多个超类的单个类的能 ...

  4. java中有没有栈_Java中堆和栈有什么区别

    stack 和 heep 都是内存的一部分stack 空间小,速度比较快, 用来放对象的引用heep 大,一般所有创建的对象都放在这里.栈(stack):是一个先进后出的数据结构,通常用于保存方法(函 ...

  5. java 基本类型 引用_java中 引用类型 和 基本类型 有何区别?

    栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. Java的堆是一个运行时数据区,类的(对象从中分配空间.这些对象通过new.newa ...

  6. java 接口 安全加密_Java中的安全加密

    java 接口 安全加密 上一次我写关于密码学的文章时 ,我概述了Apache Shiro加密API,并展示了如何使用其两个对称密码. 我还写道:"您不需要在应用程序中加密和解密敏感数据的更 ...

  7. java构造器详解_Java中关于构造器的使用详解

    这篇文章主要介绍了Java构造器使用方法及注意事项的相关资料,这里举例说明如何使用构造器及需要注意的地方,需要的朋友可以参考下 Java构造器使用方法及注意事项 超类的构造器在子类的构造器运行之前运行 ...

  8. java读取文件 路径_Java中的获取文件的物理绝对路径,和读取文件

    获取文件的绝对路径,读取该文件 一.文件目录打印图 下面的文件目录图,是项目中文件的位置信息:下面的例子是按照这个图来演示的. . |-- java | |-- ibard | | |-- demo1 ...

  9. java多线程 线程安全_Java中的线程安全

    java多线程 线程安全 Thread Safety in Java is a very important topic. Java provides multi-threaded environme ...

最新文章

  1. python自学教程读书导图-python机器学习基础教程读书笔记八(全书总结)
  2. SNMP监控一些常用OID的总结
  3. 【BZOJ5470】【FJOI2018】—所罗门王的宝藏(BFS)
  4. Electron中通过net的API发出HTTP请求
  5. Visual Studio调试之断点技巧篇
  6. java gc 触发_Java GC种类和触发时机
  7. sqlserver索引维护(重新组织生成索引)
  8. 深入Nginx之《常用参数配置技巧》
  9. ftp 553 Could not create file
  10. MinIO Docker 快速入门 ​​​​​​​
  11. 以数据为中心的存储观
  12. 10 个牛逼的一行代码就能搞定的编程技巧,你会用吗?
  13. C/C++ C# unity Python 帮助文档 书籍 学习资料
  14. 我认知的javascript之作用域和闭包
  15. 哪种存储器是非易失的_非易失性存储器和易失性存储器有什么全部详细资料对比...
  16. Google官方架构MVI
  17. composer global require “fxp/composer-asset-plugin:~1.3“ 错误 1407742e
  18. item_search - 根据关键词取拼多多商品列表
  19. 发一些收藏的收费MD5
  20. 2021爱分析·快消品牌数字化趋势报告——多点开花,快消品牌商数字化新探索

热门文章

  1. F Christmas Game
  2. 等比数列三角形 (数论 + 黄金分割点)+ JOISC 2016 Day3 T3 「电报」(基环树 + 拓扑排序)
  3. 不止代码:循环比赛(分治)
  4. 牛客小白月赛18-记录
  5. POJ1456-Supermarket【并查集】
  6. ssl1763-观光旅游【最小环,Floyd,dijkstra】
  7. 2018-2019 ACM-ICPC, Asia Seoul Regional Contest——A - Circuits
  8. SDOI2018 物理实验
  9. 13、字符集和字符编码
  10. Spark Streaming之统计socket单词数