我们正在为Windows开发自动化软件,该软件通过我们自己的专用连接协议与特定设备进行通信。该软件包由多个服务器(包括HTTP)和客户端应用程序组成,通常在私有企业环境中运行。这里最重要的是,通常我们的服务器组件不会有域名(仅仅拥有IP地址就足够了)。现在,我们有了一个创建web应用程序的请求,该应用程序将与我们的服务器组件安全地从互联网上进行通信。最明显的方法是HTTPS/SSL。我们可以做到的。他们的问题是:我们包的消费者是否需要从可信的CA购买SSL证书(拥有一个自签名的证书是不够的)?可信CA可以仅仅基于IP地址而不使用域名来颁发证书吗?
发布于 2012-11-22 10:44:32
我认为这里有两种选择:
发布于 2012-11-22 12:22:56
你的问题在客户端。在SSL连接中,客户端必须使用服务器的公钥,因此必须确保它知道正确的密钥;攻击者的目标是诱使客户端使用假公钥。SSL定义服务器将其公钥作为证书链的一部分发送,然后由客户端验证(验证签名、日期、吊销状态和大量扩展的复杂过程)。但是,有效的证书本身对客户端并没有什么帮助;客户端必须确保它知道服务器的证书。因此,客户端必须在(有效)证书中查找“预期的服务器标识”。
因此,你对这个主题有两个重要的方面:
在通常的Web上下文中,客户端是Web浏览器,浏览器供应商(或OS供应商)已经为其提供了大量的“默认根CA”。身份匹配在RFC 2818中描述:由于客户端试图连接到包含主机名的URL,客户端将在证书中的两个位置(主题名称的CN部分和主题Alt名称扩展名)中查找相同的主机名。这就是“域名”产生影响的地方:客户端在证书中查找的名称也是客户端针对DNS使用的名称,以了解实际连接的位置。
如果您同时控制客户端和服务器代码,那么您可以选择任何您想要的机制。客户端可以预先“知道”服务器的公钥(在代码中硬编码,或者通过本地配置文件),而完全忽略服务器的证书。客户端可以验证您认为合适的任何CA集的证书,而不一定与Web浏览器中包含的CA相同。您可以维护自己的服务器:如果这只是针对您的服务器,CA最多每年会颁发几个证书,因此它可以使用相当粗糙的技术(您可能希望将其保存在一个保险箱中,但它可以使用廉价的软件和手动过程;例如,请参见EJBCA,甚至OpenSSL)。最后但并非最不重要的一点是,您不需要在RFC 2818要求的相同位置上查找服务器的身份。因此,处理域名并不是很难的要求。
如果您不控制客户端代码(例如,客户端是Web浏览器,或者某些现有库代码坚持使用与Web浏览器相同的规则,即RFC 2818),那么根据定义,您需要遵守Web用法:与域名链接、来自“公认的”CA (客户端系统信任的CA)的证书。
发布于 2012-11-22 10:58:48
SSL证书提供公共名称的真实性,在HTTPS世界中,该名称是域名。基本上,浏览器根据证书的验证和公共名称与当前域的比较来验证证书。因此,对于www.example.com,证书必须有一个与www.example.com匹配的公共名称。这可能不是直接匹配,因为子域通配符证书可以与*.example.com匹配。但是,为foobar.com生成的证书永远不允许与barfoo.com匹配,反之亦然。记住,如果这是严格在浏览器内的实现。
但是,在自定义客户端实现中,可以以任何您认为合适的方式强制使用公共名称。它可能是一个人的真名、GUID、IP地址等等。事实上,存储在公共名称字段中的数据并不重要,但是针对真实身份来执行该数据是重要的。使用域名的原因是,域可能代表各种IP地址。特定主机的DNS记录可能有一个A记录(IPv4地址)、一个AAAA记录(IPv6地址)、一个MX记录(邮件服务器)等等。实际上,它可能有多个A记录,以便在多个物理主机之间实现负载平衡。此外,IP地址可以是动态的,并且经常被重新分配。这意味着单个站点不能总是通过其IP地址来标识。为与您的域关联的所有IP地址生成和维护SSL证书将非常麻烦,如果IP地址更改,则需要重新颁发新的证书。这远非理想,因此拥有一个SSL证书对域进行身份验证是一个更好的解决方案。
我不明白的是,为什么您的服务器不会与域名相关联。手动向IP地址颁发SSL证书将是痛苦的,要获得一个著名的CA为您签名要困难得多。我还要求您在服务器if发生更改时推送产品更新,而不是自己更改DNS记录。如果你的客户需要从一个新的设备到你的服务器,他们将不得不写下你的IP并发送过来,而不是仅仅记住一个简单的域名。此外,你可以获得几乎零域名-只有10美元/年在某些情况下。
https://security.stackexchange.com/questions/24369
复制相似问题