Как проверить временные метки подписанного сертификата (SCTS) в Go

#http #go #ssl #openssl #ssl-certificate

#http #Вперед #ssl #openssl #ssl-сертификат

Вопрос:

Я пишу клиентское приложение Go HTTP, и ему необходимо проверить SCT, чтобы воспользоваться преимуществами прозрачности сертификата. Поддерживается ли это автоматически в последней версии Go? Как вы этого добиваетесь?

Ответ №1:

Здесь есть два аспекта:

  1. извлечение SCT из TLS-соединения
  2. проверка SCT по журналам CT

Извлечение SCT легко выполняется в стандартной библиотеке с тремя различными вариантами для RFC 6962:

  • как расширение в самом конечном сертификате
  • в качестве расширения TLS при квитировании
  • в ответе OCSP

Все они доступны через tls.ConnectionState в их соответствующих полях:

  • state.PeerCertificates[0].Extensions под расширением с идентификатором asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 11129, 2, 4, 2}
  • state.SignedCertificateTimestamps
  • state.OCSPResponse

Их все еще необходимо правильно проанализировать.

Проверка SCT сложнее и не является частью стандартной библиотеки. Это включает в себя следующее:

  • наличие списка доверенных журналов CT
  • поиск журнала CT, открытый ключ которого использовался для подписи SCT
  • проверка подписи
  • проверка включения сертификата в дерево merkle CT и проверка временных меток

Это можно сделать с помощью утилит certificate-transparency-go, но они не включают быстрый и простой способ использовать его в качестве библиотеки.

Одна библиотека, которая пытается упростить все это, доступна по адресу github.com/mberhault/go-sct. Это можно использовать следующим образом для проверки SCT после получения HTTPS:

Отказ от ответственности: я являюсь автором 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.Состояние соединения, полученное с помощью других методов (при tls.Conn или при tls.Config.VerifyConnection обратном вызове).

Комментарии:

1. Я пару раз сталкивался с этой библиотекой, но не совсем понимаю, как она предназначена для использования. Я посмотрю глубже.

2. Он используется для создания серверов и мониторов CT, а не для проверки на стороне клиента. Хотя он включает в себя все функциональные возможности для этого, это просто не так тривиально.

3. Есть веская причина, по которой это не просто запечено в http-клиенте? Я даже не могу найти никого, кто запрашивал бы эту функциональность. Люди все еще используют закрепление сертификата или это просто то, о чем никто по-настоящему не беспокоится?

4. Проверка SCTS — недешевое предложение, потенциально это добавляет немало дополнительных обходов. Но это просто означает, что это должно быть необязательным. Я так же, как и вы, озадачен тем, почему это не включено, CT существует уже довольно много лет.

5. Доступна библиотека прототипов , но прочитайте предостережения.