1 回答

TA贡献1770条经验 获得超3个赞
这里有两个方面:
从 TLS 连接中检索 SCT
根据 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 进行。
- 1 回答
- 0 关注
- 245 浏览
添加回答
举报