Когда / зачем вам нужно использовать CACert в TLS-согласовании?
Я пытаюсь понять параметры, используемые для настройки TLS (специально для rabbitmq, но мой вопрос может быть более общим).
Есть 4 основных объекта для рассмотрения:
Ключ - закрытый ключ, используемый партнером для расшифровки отправленных ему сообщений, которые были зашифрованы с использованием его открытого ключа.
Сертификат - сертификат, содержащий открытый ключ одноранговых узлов. Он также содержит некоторые идентифицирующие данные, такие как имя хоста, организация и т. Д., Многие из которых являются необязательными. Сертификат может быть без подписи (редко, если вообще когда-либо?), Самоподписанным или подписанным центром сертификации.
CACert - сертификат CA, которому доверяет одноранговый узел, который можно использовать для расшифровки и проверки подписи подписанного сертификата.
CA-ключ - закрытый ключ CA, который он использовал для подписания сертификата.
Они соответствуют параметрам конфигурации, в том числе:
enablePeerVerification - если true, то партнер пытается проверить, является ли сервер тем, кем он говорит, проверяя, действительно ли сертификат был подписан ЦС (и аналогично по цепочке доверия, пока он не достигнет ЦС, которому он доверяет, потому что у него есть сертификат в его Локальный центр доверия ТС). Это плохая идея, чтобы установить это в ложь, так как кто-то может выдать себя за сверстника. (на ходу этот параметр называется InsecureSkipVerify как предупреждение). Если сертификат является самоподписанным, проверка на одноранговом узле невозможна. Эта опция позволяет вам использовать самоподписанный сертификат сверстника на свой страх и риск (например, во время разработки).
Ключ - закрытый ключ, используемый для расшифровки
Cert - используется для шифрования (и подтверждения связи)
CACert - сертификат CA, подписавшего сертификат "Cert"
Почему существуют параметры конфигурации для CACert?
Если сертификат подписан центром сертификации, то он уже содержит достаточно информации для определения местоположения центра сертификации (например, имя домена). Для чего нужен CACert и если или когда он отправляется во время согласования TLS? Это просто удобство, чтобы спешить в СА напрямую? Вам все равно придется это сделать, если CACert не совпадает или не указывает на него в вашем хранилище доверенных сертификатов.
Настройки, о которых я говорю, это "cacert" в rabbitmq.config для сервера и amqp_ssl_socket_set_cacert() в C API (rabbitmq-c).
Я хотел бы проверить правильность моего понимания ( https://xkcd.com/386/)
1 ответ
Во-первых, закрытый ключ CA здесь не имеет значения, поскольку по определению он является личным, и, следовательно, у вас его никогда не будет, кроме случаев, когда вы создаете самозаверяющие сертификаты.
Рукопожатие TLS является:
- сервер, к которому вы подключаетесь, отправляет вам свой сертификат и, необязательно, список промежуточных сертификатов вплоть до корневого (CA), последний из которых также является необязательным и часто не отправляется, поскольку клиент должен иметь его уже в своем доверенном хранилище.
- если сервер запрашивает сертификат клиента, он отправляет список CA, которые он примет для сертификата клиента (это подсказка, чтобы помочь клиенту выбрать подходящий сертификат для отправки)
- поэтому, если это необходимо, клиент отправляет свой сертификат и, как в первом пункте, потенциальный список промежуточных сертификатов вплоть до некоторого корневого каталога.
В зависимости от клиента у вас может быть несколько элементов конфигурации: - список сертификатов для отправки в качестве промежуточного (либо в виде пути к некоторому каталогу, либо в виде отдельного файла со всеми ними в нем) вместе со своим собственным клиентским сертификатом - список сертификаты, которые вы используете (опять же каталог или файл) как полностью доверенные для проверки сертификата сервера.
Зачастую эти два оседлых являются только одним.
Сейчас:
Если сертификат подписан центром сертификации, то он уже содержит достаточно информации для определения местоположения центра сертификации (например, имя домена).
Не уверен, что понимаю вас, но в целом нет. Во-первых, сертификат не обязательно / только для доменного имени, он может быть для других вещей. Затем сертификат обычно подписывается посредником, а не непосредственно СА. Так что я не уверен, как вы хотите определить местонахождение CA?