在存在“信任证书”和其他属性的情况下......这有多重要?
OpenSSL 现在是否实现了?如果没有,为什么 OpenSSL 不实现?
答案1
在大多数使用 SSL 的协议/应用程序中,客户端需要检查以下两个内容:(1) 服务器提供有效的证书,这意味着该证书由受信任的 CA 颁发且未过期、撤销或篡改,并且 (2) 该证书适用于您想要的服务器,不是您的连接被错误或故意攻击路由到的其他人。 (在极少数情况下,您不需要服务器身份验证,只需要机密性,但是您最好使用明确不进行身份验证的“anon”或“aNULL”密码套件。)
迄今为止,OpenSSL 执行 (1) 但不执行 (2),并且通常仅支持其信任库中的 CA 根证书;一个 CA 根可能“负责”数千或数百万个服务器证书,例如,如果 Verisign 向两者颁发了证书bigbank.com
,localdiner.com
这并不意味着我想将我的 bigbank 帐户交给 localdiner。因此,应用程序需要执行 (2),无论是在 verify_callback 中,还是在握手完成之后但在发送(敏感)数据之前。下一个主要版本 1.0.2 计划包含对证书链验证的增强,并且我相信至少在某些情况下还会进行名称验证。请注意,对于使用 RFC 2818 的 HTTPS 或使用 RFC 6125 的其他基于 TLS 的协议,您需要检查主题中的 CommonName 和SubjectAlternativeNames 扩展(如果存在)。
我不知道为什么选择 OpenSSL(以及在此之前的 SSLeay)不这样做已经。有人可能会说,一些不寻常的 SSL/TLS 应用程序需要标准 CN/SAN 以外的东西,但 OpenSSL 在其他领域可以处理常见情况,并为罕见情况提供回调或选项。我认为这可能是工作太多而人员不足(直到最近)。