jar有效的日志
因此,我有一个天真的想法,即除了证书有效性检查(在Java中)之外,将证书透明度验证作为每个请求的一部分是很容易的。
牺牲了一半的周末,我可以证明这并不是那么微不足道。但是什么是?简而言之,它是世界上所有TLS证书的公开日志(尽管SSL已经过时,这些证书仍然被称为SSL证书)。您可以检查日志是否在该日志中发布,如果没有,则有可疑之处,因为CA必须将其颁发的所有证书推送到日志中。还有其他用例,例如,为您的域注册新证书的通知,以检测可能被劫持的DNS管理面板或C
我想要做的是,前者--使来自Java应用程序的每个请求都在证书透明日志中验证另一方的证书。似乎这是没有现成的(如果是,我找不到它)。Jep 244,似乎讨论了与证书透明度相关的TLS扩展,但我无法找到最终是否支持它)。
首先,我认为您可以简单地获得证书,并通过证书的指纹检查它是否包含在日志中。这太容易了--日志允许通过散列检查,但是这不是证书的指纹,而是签名的证书时间戳--这是日志在包含之前发出的签名
SCT(签名证书时间戳)是日志承诺将证书合并到Merkle树中
A 一种非常酷的数据结构,通过提供一个比整个日志短得多的“包含验证”(从而节省了大量带宽),可以让外部参与者确信日志中有什么东西在日志中。事实上,默克尔树的凉爽性是我首先对证书透明性感兴趣的原因(因为我们在我
所以,为了你必须以某种方式获得SCT。我一开始,但是你不能。一旦你有了它,你可以使用客户端在日志中检查它,但是获得它更困难。(注意:对于服务器端验证,可以通过HTTP查保持用户的匿名性)。
获取SCT可以取决于服务器和/或日志和/或CA选择支持的内容:SCT可以包含在证书中,也可以在TLS握手期间作为TLS扩展提供,也可以在握手期间包括在TLS固定响应中。不幸的是,我检查过的几个证书中没有存储SCT,所以我不得不到一个较低的级别调试TLS握手。
https://m.douban.com/mip/note/811237689/
我启用了TLS强震,那里什么都没有。Google确实将SCTS作为TLS扩展(根据Qualys的说法),但是Java输出没有提到它。
幸运的是(?)谷歌基于Google的OpenSSL分支的Java安全提供商。事情开始变得一团糟了,…但我去找了,包括了氪星公司注册为安全服务商。我必须使用Conscrapt TrustManager(使用JDK中所有受信任的证书初始化)建立连接:
https://greasyfork.org/th/scripts?set=474350
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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(HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();conn.setSSLSocketFactory(ctx.getSocketFactory());conn.connect();conn.getInputStream();conn.disconnect(); |
当然,它一开始就不起作用,因为康瑞普没有提供一些需要的核心接口的实现--CTLogStore和CTPolicy类。CTLogStore实际上是保存所有已知日志信息的重要部分(我仍然觉得调用“日志提供程序”只是“日志”很奇怪,但这是公认的术语)。有一个,在,这很酷,但我花了一段时间(在外部帮助下)弄清楚这些公钥到底是什么。他们是-RSA,ECC?它们是如何编码的?您在RFC或文档中找不到这一点。可能是bjectPublicKeyInfo ASN.1结构的DER编码”。啊。
https://m.douban.com/mip/note/811141093/
本西堡去营救。我和邦西城堡的关系是一种爱恨的关系。我讨厌它是多么的不直观,它的API是多么复杂,但我喜欢它拥有(几乎)所有与密码学相关的东西,这是您可能需要的。在试图弄清楚如何将公钥转换为
PublicKey对象时浪费了一段时间之后,我发现使用PublicKeyFactory.createKey(Base64.getDecoder().decode(base64Key));给出任何算法的参数-它可以返回椭圆曲线密钥参数或RSA密钥参数。然后,您只需将它们包装在另一个类中,并将它们传递到另一个工厂(典型的Bouncy城堡),然后就可以使用公钥了。
当然,现在Google的Conscrapt不再工作了,因为经过转换之后,publicKey的编码版本与原来的字节不一样,因此日志ID计算是错误的。但是,通过一些反射,我修正了这个问题,最后,它起了作用--证书透明日志被查询,证书被显示为有效并且正确地包含在日志中。。是的,它使用了几个安全提供商,一些奇怪的BouncyCastleAPI和一些在Google提供商中缺失的简单实现。已知的证书可能被缓存,因此不会执行对日志的重复调用,但这超出了我实验的范围。

浙公网安备 33010602011771号