У меня есть клиент ac # .net, потребляющий сообщения из экземпляра RabbitMQ (используя RabbitMQ.Client), защищенный с помощью TLS.У меня все отлично работает, используя самозаверяющий сертификат.
Мы купили сертификат с подстановочными знаками в аккредитованном центре сертификации, чтобы использовать его в дальнейшем.Этот сертификат фактически был подписан промежуточным органом корневого ЦС, которому доверяет сам корневой ЦС.
Поскольку промежуточный ЦС не будет доверен клиентской машине (сертификат не будет установлен вхранилище сертификатов локальной машины), мы загрузили файл PEM, который содержит все сертификаты, составляющие цепочку доверия.Однако клиент .net не будет проверять этот сертификат, потому что он не может установить цепочку доверия.
Я осмотрелся и не могу найти ничего, что говорит, что .net не может проверять сертификаты PEM, которые сами содержатнесколько сертификатов.Если я назначу пользовательский делегат свойству CertificateValidationCallback RabbitMQ ConnectionFactory, я вижу, что цепочка сертификатов содержит только один сертификат, который является сертификатом, подписанным промежуточным CA.
Клиент в конечном итоге будет развернутк сотням машин, поэтому нам не нужно было бы развертывать промежуточный сертификат на всех из них, а затем управлять ими в будущем.Я знаю, что могу отключить проверку цепочки, установив для свойства AcceptablePolicyErrors значение SslPolicyErrors.RemoteCertificateChainErrors, но мне кажется, что это делает вещи немного менее безопасными.
Итак, у меня есть два основных вопросаздесь:
- Может ли криптографическая проверка .net просто не поддерживать сертификаты, которые содержат все другие сертификаты в цепочке (по крайней мере, если этот сертификат является PEM)?
- Есть ли способработать вокруг этого?
Я использую .net 4.5.2, хотя та же проблема возникает в .net 4.6.2 и .net 4.7.1.
Язапустить его на компьютере с Windows 7.Узел RabbitMQ работает на сервере Windows 2012.