簡體   English   中英

如何驗證 Go 中的簽名證書時間戳 (SCT)

[英]How to verify signed certificate timestamps (SCTs) in Go

我正在編寫一個 Go HTTP 客戶端應用程序,它需要驗證 SCT 才能利用證書透明度。 最新的 Go 版本是否自動支持此功能? 你如何做到這一點?

這里有兩個方面:

  1. 從 TLS 連接中檢索 SCT
  2. 根據 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 日志列表
  • 查找其公鑰用於簽署 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 執行相同的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM