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