如何在 Go 中验证签名证书时间戳 (SCT)
How to verify signed certificate timestamps (SCTs) in Go
我正在编写一个 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, 1, 11129, 2, 4, 2}
的扩展名下
state.SignedCertificateTimestamps
state.OCSPResponse
那些仍然需要正确解析。
验证 SCT 比较棘手,并且 不是 标准库的一部分。这涉及以下内容:
- 拥有可信 CT 日志列表
- 查找其 public 密钥用于签署 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 执行相同的操作。
我正在编写一个 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, 1, 11129, 2, 4, 2}
的扩展名下
state.SignedCertificateTimestamps
state.OCSPResponse
那些仍然需要正确解析。
验证 SCT 比较棘手,并且 不是 标准库的一部分。这涉及以下内容:
- 拥有可信 CT 日志列表
- 查找其 public 密钥用于签署 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 执行相同的操作。