我最近遇到了将数据发布到SSL证书已更新的服务器的问题。我做了一些研究,发现当CURLOPT_SSL_VERIFYPEER设置为false时,发布日期成功完成。有人能解释一下CURLOPT_SSL_VERIFYPEER和_VERIFYHOST之间的关系吗?另外,如果我将VERIFYPEER设置为false,我是否不再通过安全连接传输数据?
非常感谢任何人都可以提供帮助。
答案 0 :(得分:19)
连接仍将是SSL加密的。您只是不会在使用经验证的正确证书的链接上执行此操作。任何人都可以创建自己的SSL证书,在您的浏览器和Web服务器支持的任何级别上都可以完全接受。
然而,您会得到许多关于无法验证证书真实性的投诉。这是为了防止Joe M. Alicious创建自称为“microsoft.com”的证书并设置自己的Windows Update主机。该证书将说它是microsoft.com,但它不能被认证为实际上是microsoft.com,因为Verisign(或任何人)实际上没有颁发该证书并在其上放置自己的真实性标记(签署证书)。
_VERIFYHOST用于检查您所连接的URL的主机名(例如“microsoft.com”)是否列在SSL证书中。如果将此选项设置为false,则将忽略url / cert主机名不匹配(例如,您在testbox.develhost.com上有一个开发框,但正在使用您客户端的真实有效'example.com'证书)。
_VERIFYPEER禁用验证整个证书。这允许自签名证书工作。否则,SSL库将禁止证明证书的颁发者无效。
但无论任何一种设置,如果强制通过连接,它将被ssl加密。
答案 1 :(得分:1)
我想从我的测试中清楚_VERIFYHOST和_VERIFYPEER之间的关系。
_VERIFYHOST检查公用名(CN),因为手动表示依赖于选项1或2.此验证仅检查并生成错误消息大小写失败。验证本身对连接没有影响,甚至发生验证错误。它是_VERIFYPEER用来减少或继续连接的结果。
_VERIFYPEER(1)检查2件事。首先,它使用CAINFO检查证书。如果CAINFO在curl选项中指定,则使用该值进行检查,否则使用php.ini中的值指定进行检查。其次,它检查来自_VERIFYHOST的结果(case set _VERIFYHOST为1或2)。如果验证通过两个条件,则连接将继续。否则连接将被削减。
答案 2 :(得分:0)
如果禁用CURLOPT_SSL_VERIFYPEER,则不会验证证书(并忽略CURLOPT_SSL_VERIFYHOST的值)。结果,这让你对中间人攻击不安全。这意味着您不再通过安全连接传输数据。
是的,数据已加密,但仍然不安全。你知道你要发送给某人,但你不知道是谁;您可能会将其发送给用户的主要敌人(仔细加密它,以便除了攻击者之外没有人可以读取数据)。这是不好的。如果您使用攻击者的公钥加密它,那么世界上所有的加密都不是很好。
底线:不要禁用CURLOPT_SSL_VERIFYPEER。它让你不安全。
有关安全使用cURL SSL支持需要执行的操作的更多信息,请参阅Security consequences of disabling CURLOPT_SSL_VERIFYHOST (libcurl/openssl)。