Http 如何在Go中验证签名证书时间戳(SCT)
我正在编写一个Go HTTP客户端应用程序,它需要验证SCT以利用证书透明性。最新Go版本是否自动支持此功能?您是如何做到这一点的?这里有两个方面:Http 如何在Go中验证签名证书时间戳(SCT),http,go,ssl,openssl,ssl-certificate,Http,Go,Ssl,Openssl,Ssl Certificate,我正在编写一个Go HTTP客户端应用程序,它需要验证SCT以利用证书透明性。最新Go版本是否自动支持此功能?您是如何做到这一点的?这里有两个方面: 从TLS连接检索SCT 根据CT日志验证SCT 检索SCT很容易在标准库中完成,每个库有三种不同的情况: 作为叶证书本身的扩展 作为握手中的TLS扩展 在OCSP响应中 所有这些信息都可通过各自领域的: state.PeerCertificates[0]。扩展名,位于ID为asn1.ObjectIdentifier{1,3,6,1,4,1,1
- 作为叶证书本身的扩展
- 作为握手中的TLS扩展
- 在OCSP响应中
,位于ID为asn1.ObjectIdentifier{1,3,6,1,4,1,11129,2,4,2}的扩展名下state.PeerCertificates[0]。扩展名
state.signedCertificateTimestamp
state.OCSPResponse
- 拥有受信任的CT日志列表
- 查找其公钥用于签署SCT的CT日志
- 验证签名
- 验证证书是否包含在CT的merkle树中并检查时间戳
github.com/mberhault/go-sct
的作者
导入“github.com/mberhault/go-sct”
//在HTTPS GET请求后验证SCT。
resp,err:=http.Get(“https://www.certificate-transparency.org")
如果出错!=零{
死机(“获取失败”+错误()
}
err=sct.CheckConnectionState(分别为TLS)
如果出错!=零{
死机(“SCT检查失败”+错误()
}
通过其他方法(在
tls.Conn
上,或在tls.Config.VerifyConnection
回调中)获得的tls.ConnectionState上也可以执行相同的操作。我已经多次使用此库,但不完全理解它的用途。我会看得更深入一些。它用于构建CT服务器和监视器,而不是用于客户端检查。虽然它包含了所有的功能,但它并不是那么简单。有什么好的理由可以解释为什么这不只是在http客户机中实现的?我甚至找不到任何人要求这个功能。人们是否仍在使用证书固定,或者这只是没有人真正担心的事情?验证SCT不是一个便宜的建议,它可能会增加相当多的额外往返。但这只是意味着它应该是可选的。我和你一样对为什么不包括CT感到困惑,CT已经存在好几年了。有一个可用的,但请阅读注意事项。