为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
幕布斯6054654 2022-06-27 10:47:08
我正在编写一个 Go HTTP 客户端应用程序,它需要验证 SCT 以利用证书透明度。最新的 Go 版本是否自动支持此功能?你如何做到这一点?
查看完整描述

1 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

这里有两个方面:

  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 的 merkle 树中并检查时间戳

这可以使用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())

}

同样可以对通过其他方法(在 atls.Conn或tls.Config.VerifyConnection回调中)获得的 tls.ConnectionState 进行。


查看完整回答
反对 回复 2022-06-27
  • 1 回答
  • 0 关注
  • 245 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号