Ответ
При HTTPS соединении обмен сертификатами происходит во время TLS handshake:
-
Client Hello
Клиент отправляет список поддерживаемых шифров и случайное число. -
Server Hello
Сервер выбирает шифр, отправляет своё случайное число и сертификат (с публичным ключом). -
Проверка сертификата
Клиент проверяет сертификат (срок, цепочку доверия, CN/SAN). Если проверка не пройдена - соединение прерывается. -
Key Exchange
Клиент генерирует pre-master secret, шифрует его публичным ключом сервера и отправляет.
Пример проверки сертификата в Go:
tlsConfig := &tls.Config{
InsecureSkipVerify: false, // Проверять сертификат
RootCAs: certPool, // Доверенные CA
}
После этого устанавливается защищённое соединение с симметричным шифрованием. Сервер может запросить сертификат клиента (mTLS), но это опционально.