繁体   English   中英

如何验证 Go 中的签名证书时间戳 (SCT)

[英]How to verify signed certificate timestamps (SCTs) in Go

我正在编写一个 Go HTTP 客户端应用程序,它需要验证 SCT 才能利用证书透明度。 最新的 Go 版本是否自动支持此功能? 你如何做到这一点?

这里有两个方面:

  1. 从 TLS 连接中检索 SCT
  2. 根据 CT 日志验证 SCT

检索 SCT很容易在标准库中完成,每个RFC 6962有三种不同的情况:

  • 作为叶证书本身的扩展
  • 作为握手中的 TLS 扩展
  • 在 OCSP 响应中

所有这些都可以通过各自字段中的tls.ConnectionState获得:

  • state.PeerCertificates[0].Extensions ,在 ID asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 11129, 2, 4, 2}的扩展下
  • state.SignedCertificateTimestamps
  • state.OCSPResponse

那些仍然需要正确解析。

验证 SCT比较棘手,并且不是标准库的一部分。 这涉及以下内容:

  • 有一个可信的 CT 日志列表
  • 查找其公钥用于签署 SCT 的 CT 日志
  • 验证签名
  • 验证证书是否包含在 CT 的默克尔树中并检查时间戳

这可以使用certificate-transparency-go实用程序拼凑在一起,但它们没有包含将其用作库的快速简便的方法。

github.com/mberhault/go-sct提供了一个试图让这一切变得更容易的图书馆。 在 HTTPS GET 之后,可以按如下方式验证 SCT:

免责声明:我是github.com/mberhault/go-sct的作者。

import "github.com/mberhault/go-sct"

// Verifying the SCTs after a HTTPS GET request.
resp, err := http.Get("https://www.certificate-transparency.org")
if err != nil {
    panic("get failed " + err.Error())
}

err = sct.CheckConnectionState(resp.TLS)
if err != nil {
    panic("SCT check failed " + err.Error())
}

可以对通过其他方法(在tls.Conn上或在tls.Config.VerifyConnection回调中)获得的 tls.ConnectionState 执行相同的操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM