Обеспечение полных цепочек сертификатов для одноранговых узлов Secure Transport.
API безопасного транспорта Apple определяет функцию, SSLSetCertificate
из которыхcertRefs
Параметр представляет собой массив сертификатов. В документации говорится (выделение добавлено):
Вы должны поместить в
certRefs[0]
SecIdentityRef
объект, который идентифицирует листовой сертификат и соответствующий ему закрытый ключ. Указывать корневой сертификат необязательно; если он не указан, корневой сертификат, который проверяет указанную здесь цепочку сертификатов, должен присутствовать в общесистемном наборе доверенных сертификатов привязки.
Хотя в нем говорится "корневой сертификат... должен присутствовать",неясно, будут ли обнаруженные цепочки доверия фактически предоставлены одноранговому узлу SSL (хотя трудно придумать какую-либо другую причину существования этого требования).
Каким образом можнообеспечить, чтобы одноранговый узел предоставлял полную цепочку сертификатов (обратно в самозаверяющий корень или в качестве привязки доверия системы)?
В частности,должны быть включены все учредительные сертификаты
certRefs
параметр (или это не имеет никакого отношения)?
Фон
Этот вопрос следует за предыдущим сообщением на ServerFault.Имея сейчас RTFS, понятно, что звонки slapd
SSLSetCertificate
только с удостоверением личности хоста и ни на одной стадии не пытается обеспечить Secure Transport цепочкой сертификатов - возможно, это нормально (поскольку Secure Transport должен все это уладить), но я догадываюсь, что это может быть причиной проблемы.
1 ответ
Хорошо, я пробрался libsecurity_ssl
и считаю, что
SSLSetCertificate
устанавливает, среди прочего, контекстlocalCert
с призывом к…parseIncomingCerts
который (получает указатель на эту переменную и) устанавливает его значение в связанный список. В то время как комментарии относятся к этому списку как к "цепочке сертификатов" - на самом деле, локальная переменная называетсяcertChain
и комментарии описывают его семантику доверия - на самом деле он просто наивно создан из массива. В частности, цепь доверия не проверяется и не проверяется, несмотря на комментарии об обратном.Несмотря на тщательный поиск, я нигде не могу найти, чтобы Secure Transport выполнял какую-либо дальнейшую работу над цепочкой сертификатов, прежде чем отправлять ее узлу. Это говорит о том, что цитата в вопросе на самом деле ошибочна: отсутствующие корневые сертификаты (в настоящее время) не должны быть среди якорей доверия системы.
Я решил:
Каким образом можно обеспечить, чтобы одноранговый узел предоставлял полную цепочку сертификатов (обратно в самозаверяющий корень или в качестве привязки доверия системы)?
Передайте это
SSLSetCertificate
,В частности, должны быть включены все учредительные сертификаты
certRefs
параметр (или это не имеет никакого отношения)?Из документации и комментариев к коду видно, что намерение Apple может состоять в том, чтобы изменить это в будущем, но пока... да, они должны.