【发布时间】:2011-06-07 07:58:39
【问题描述】:
我最近遇到了将数据发布到 SSL 证书已更新的服务器的问题。我做了一些研究,发现当 CURLOPT_SSL_VERIFYPEER 设置为 false 时,发布日期成功通过。有人可以解释 CURLOPT_SSL_VERIFYPEER 和 _VERIFYHOST 之间的关系吗?另外,如果我将 VERIFYPEER 设置为 false,我是否不再通过安全连接传输数据?
非常感谢任何人提供的任何帮助。
【问题讨论】:
我最近遇到了将数据发布到 SSL 证书已更新的服务器的问题。我做了一些研究,发现当 CURLOPT_SSL_VERIFYPEER 设置为 false 时,发布日期成功通过。有人可以解释 CURLOPT_SSL_VERIFYPEER 和 _VERIFYHOST 之间的关系吗?另外,如果我将 VERIFYPEER 设置为 false,我是否不再通过安全连接传输数据?
非常感谢任何人提供的任何帮助。
【问题讨论】:
连接仍将采用 SSL 加密。您只是不会在使用验证为正确证书的链接上执行此操作。任何人都可以为自己创建一个 SSL 证书,该证书将在您的浏览器和网络服务器支持的任何级别上进行完全可接受的加密。
但是,您会收到很多关于无法验证证书真实性的投诉。这是为了防止 Joe M. Alicious 自己创建一个声称是“microsoft.com”的证书并设置自己的 Windows 更新主机。证书会说它是 microsoft.com,但它不能被验证为实际上是 microsoft.com,因为 Verisign(或任何人)实际上并未颁发该证书并在其上贴上他们自己的真实性印章(签署证书)。
_VERIFYHOST 用于检查您连接到的 URL 的主机名(例如“microsoft.com”)是否列在 SSL 证书中。将此选项设置为 false 时,将忽略 url/cert 主机名不匹配(例如,您在 testbox.develhost.com 有一个开发框,但正在使用您的客户端真正有效的“example.com”证书)。
_VERIFYPEER 禁用验证整个证书。这允许自签名证书工作。否则 SSL 库会说证书的颁发者无效。
但无论哪种设置,如果您强制通过连接,它将被 ssl 加密。
我想从我的测试中澄清 _VERIFYHOST 和 _VERIFYPEER 之间的关系。
_VERIFYHOST check common name(CN) 如手册所说,取决于选项 1 或 2。此验证仅检查并生成错误消息 case failed。验证本身对连接完全没有影响,甚至出现验证错误。它是 _VERIFYPEER 用来切断或继续连接的结果。
_VERIFYPEER (1) 检查 2 件事。首先,它使用 CAINFO 检查证书。如果 CAINFO 在 curl 选项中指定,则检查该值,否则检查 php.ini 中指定的值。其次,它检查 _VERIFYHOST 的结果(将 _VERIFYHOST 设置为 1 或 2)。如果验证通过这两个条件,则连接将继续。否则连接将被切断。
【讨论】:
如果禁用 CURLOPT_SSL_VERIFYPEER,则不会验证证书(并且忽略 CURLOPT_SSL_VERIFYHOST 的值)。结果,这使您对中间人攻击不安全。这意味着您不再通过安全连接传输数据。
是的,数据已加密,但仍不安全。你知道你要发送给某人,但你不知道是谁;您可能会将其发送给用户的主要敌人(小心地对其进行加密,以便攻击者以外的任何人都无法读取数据)。这是不好的。如果你使用攻击者的公钥加密,世界上所有的加密都不是很好。
底线:不要禁用 CURLOPT_SSL_VERIFYPEER。它让你没有安全感。
请参阅Security consequences of disabling CURLOPT_SSL_VERIFYHOST (libcurl/openssl),了解更多关于安全使用 cURL 的 SSL 支持所需做的事情。
【讨论】: