#http #go #ssl #openssl #ssl-certificate
#http #Вперед #ssl #openssl #ssl-сертификат
Вопрос:
Я пишу клиентское приложение Go HTTP, и ему необходимо проверить SCT, чтобы воспользоваться преимуществами прозрачности сертификата. Поддерживается ли это автоматически в последней версии Go? Как вы этого добиваетесь?
Ответ №1:
Здесь есть два аспекта:
- извлечение SCT из TLS-соединения
- проверка 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. Доступна библиотека прототипов , но прочитайте предостережения.