Apple的Secure Transport API定义了一个函数SSLSetCertificate
,其中certRefs
参数是一组证书。文档说明(强调增加):
您必须在
certRefs[0]
中放置一个SecIdentityRef
对象,以标识叶证书及其对应的私钥。指定根证书是可选的; 如果未指定,则验证此处指定的证书链的根证书必须存在于系统范围的可信锚证书集中。
虽然它说" 根证书......必须存在"但它不是清楚,这样找到的信任链是否真的被提供给SSL对等方(尽管很难想出存在该要求的任何其他原因)。
如何确保 完整证书链(返回自签名根,或系统信任锚)如何提供给对等方
特别是,必须所有成分证书都包含在此certRefs
参数中(或者没有结果)?
<子>的背景 子>
这个问题遵循an earlier post on ServerFault。现在有了RTFS,很清楚slapd calls
SSLSetCertificate
和only the host's identity certificate并且在任何阶段都没有尝试为安全传输提供证书链 - 也许这没关系(因为安全传输应该对它进行排序),但我有预感,这可能是问题的原因。
答案 0 :(得分:0)
好的,我已经陷入libsecurity_ssl
并相信:
SSLSetCertificate
设置上下文的localCert
与a call至...
parseIncomingCerts
(a pointer to that variable和} sets its value收到链接列表。虽然注释将此列表称为“证书链”-indeed,但局部变量的名称为certChain
和comments describe its trust semantics - 实际上只是naively created from the array。 特别是,尽管comments to the contrary,信任链既未经过检查也未经过验证。
尽管进行了彻底搜索,但我找不到安全传输在sending it to the peer之前在证书链上执行任何进一步工作的任何地方。这表明问题中的引用实际上是错误的:缺少根证书不(当前)需要在系统信任锚中。
我总结道:
如何确保 完整证书链(返回自签名根,或者系统信任锚)是如何提供给对等方的?
将其传递给SSLSetCertificate
。
特别是,必须所有成分证书都包含在此
certRefs
参数中(或者没有结果)?
从文档和代码评论来看,似乎Apple的意图可能是将来改变这一点,但暂时......是的,他们必须。