如何解决如何在Go中验证签名证书时间戳SCT
我正在编写一个Go HTTP客户端应用程序,它需要验证SCT才能利用证书透明性。最新的Go版本自动支持此功能吗?您如何实现的?
解决方法
这里有两个方面:
- 从TLS连接中检索SCT
- 根据CT日志验证SCT
检索SCT 在标准库中很容易完成,每个RFC 6962都有三种不同的情况:
- 作为叶子证书本身的扩展
- 作为握手中的TLS扩展
- 在OCSP响应中
所有这些都可以通过tls.ConnectionState在其各自的字段中使用:
-
state.PeerCertificates[0].Extensions
,在ID为asn1.ObjectIdentifier{1,3,6,1,4,11129,2,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())
}
可以对通过其他方法(在tls.Conn
或tls.Config.VerifyConnection
回调中)获得的tls.ConnectionState进行相同操作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。