我正在编写一个Go HTTP客户端应用程序,它需要验证SCT才能利用证书透明性。最新的Go版本自动支持吗?您如何实现的?

最佳答案

这里有两个方面:

  • 从TLS连接中检索SCT
  • 根据CT日志验证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())
    }
    
    可以对通过其他方法获得的tls.ConnectionState(在tls.Conntls.Config.VerifyConnection回调中)执行相同的操作。

    08-25 04:48