Http 如何在Go中验证签名证书时间戳(SCT)

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

我正在编写一个Go HTTP客户端应用程序,它需要验证SCT以利用证书透明性。最新Go版本是否自动支持此功能?您是如何做到这一点的?

这里有两个方面:

  • 从TLS连接检索SCT
  • 根据CT日志验证SCT
  • 检索SCT很容易在标准库中完成,每个库有三种不同的情况:

    • 作为叶证书本身的扩展
    • 作为握手中的TLS扩展
    • 在OCSP响应中
    所有这些信息都可通过各自领域的:

    • state.PeerCertificates[0]。扩展名
      ,位于ID为asn1.ObjectIdentifier{1,3,6,1,4,1,11129,2,4,2}的扩展名下
    • state.signedCertificateTimestamp
    • state.OCSPResponse
    这些仍然需要正确解析

    验证SCT更为棘手,而且不是标准库的一部分。这涉及以下方面:

    • 拥有受信任的CT日志列表
    • 查找其公钥用于签署SCT的CT日志
    • 验证签名
    • 验证证书是否包含在CT的merkle树中并检查时间戳
    可以使用实用程序将其拼凑在一起,但它们没有提供一种将其用作库的快捷方法

    一个试图使所有这些变得更容易的库位于。在HTTPS GET之后,可以按如下方式使用它来验证SCT:

    免责声明:我是
    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已经存在好几年了。有一个可用的,但请阅读注意事项。