我正在编写一个Go HTTP客户端应用程序,它需要验证SCT才能利用证书透明性。最新的Go版本自动支持吗?您如何实现的?
最佳答案
这里有两个方面:
在标准库中很容易完成的检索,每个RFC 6962都有三种不同的情况:
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 更加棘手,而且不是标准库的一部分。这涉及以下内容:
可以使用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.ConnectionState(在tls.Conn
或tls.Config.VerifyConnection
回调中)执行相同的操作。