Как происходит обмен сертификатами HTTPS соединении

«Как происходит обмен сертификатами HTTPS соединении» — вопрос из категории Безопасность, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При HTTPS соединении обмен сертификатами происходит во время TLS handshake:

  1. Client Hello
    Клиент отправляет список поддерживаемых шифров и случайное число.

  2. Server Hello
    Сервер выбирает шифр, отправляет своё случайное число и сертификат (с публичным ключом).

  3. Проверка сертификата
    Клиент проверяет сертификат (срок, цепочку доверия, CN/SAN). Если проверка не пройдена - соединение прерывается.

  4. Key Exchange
    Клиент генерирует pre-master secret, шифрует его публичным ключом сервера и отправляет.

Пример проверки сертификата в Go:

tlsConfig := &tls.Config{
    InsecureSkipVerify: false, // Проверять сертификат
    RootCAs:           certPool, // Доверенные CA
}

После этого устанавливается защищённое соединение с симметричным шифрованием. Сервер может запросить сертификат клиента (mTLS), но это опционально.