#ssl #go #ocsp
#ssl #Вперед #ocsp
Вопрос:
Я должен, используя Go, в качестве клиента выполнить проверку отзыва сертификата сервера OCSP перед завершением рукопожатия TLS, т.е. [инициировать рукопожатие -> получить сертификат сервера -> проверить статус отзыва -> если отозван, прервать], а не [инициировать рукопожатие -> завершить рукопожатие -> проверить отзывстатус]
При использовании стандартной библиотеки TLS Go это кажется невозможным, поскольку tls.Dial, похоже, не выполняет никакой проверки OCSP. Другим возможным обходным путем было бы получить сертификат сервера без выполнения рукопожатия, затем проверить статус отзыва и, если статус в порядке, повторить рукопожатие с использованием tls.Наберите, но я не смог найти способ сделать это в Go.
Есть предложения о том, как решить эту конкретную проблему?
Ответ №1:
Вы можете установить VerifyPeerCertificate
в tls.Config
объекте и указать, чтобы указанная функция возвращала ошибку, отличную от нуля, если проверка отзыва завершается неудачей, и вы хотите прервать рукопожатие.
Из документации:
// VerifyPeerCertificate, if not nil, is called after normal
// certificate verification by either a TLS client or server. It
// receives the raw ASN.1 certificates provided by the peer and also
// any verified chains that normal processing found. If it returns a
// non-nil error, the handshake is aborted and that error results.
//
// If normal verification fails then the handshake will abort before
// considering this callback. If normal verification is disabled by
// setting InsecureSkipVerify, or (for a server) when ClientAuth is
// RequestClientCert or RequireAnyClientCert, then this callback will
// be considered but the verifiedChains argument will always be nil.
VerifyPeerCertificate func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error // Go 1.8