我有一个使用嵌入式网络服务器的桌面产品,它将使用自签名证书。
我可以在网页中放入一些东西来检测他们没有将根 CA 添加到他们的受信任列表中,并显示链接或 DIV 或指导他们如何操作的东西吗?
我在想可能是一个包含安装 CA 的说明的 DIV,以及一个运行一些测试的 Javascript(尝试在没有内部警告的情况下访问某些东西??),如果测试成功,则隐藏 DIV。或类似的东西...
来自辉煌的 SO 社区的任何想法?:)
我有一个使用嵌入式网络服务器的桌面产品,它将使用自签名证书。
我可以在网页中放入一些东西来检测他们没有将根 CA 添加到他们的受信任列表中,并显示链接或 DIV 或指导他们如何操作的东西吗?
我在想可能是一个包含安装 CA 的说明的 DIV,以及一个运行一些测试的 Javascript(尝试在没有内部警告的情况下访问某些东西??),如果测试成功,则隐藏 DIV。或类似的东西...
来自辉煌的 SO 社区的任何想法?:)
你为什么要这样做?训练用户不加选择地安装根 CA 证书只是因为网站告诉他们这样做是一个坏主意。你正在破坏整个信任链。有安全意识的用户会忽略您安装证书的建议,并且可能会得出结论,您没有认真对待安全性,因为您没有费心从现有 CA 获取证书。
你真的需要HTTPS吗?如果是这样,您可能应该硬着头皮与 CA 达成协议,以便为您的客户提供适当的 CA 签名服务器证书。如果 Web 服务器仅用于来自桌面应用程序的本地连接,您应该在安装过程中将自签名证书添加到受信任列表中,或者改用 HTTP。
我唯一的想法是使用框架和一些 javascript。
框架的第一个元素将充当看门狗,等待 x 时间(javascript setTimeout),然后向用户显示您的自定义 ssl 失败消息,其中包含超链接或下载自签名证书的说明。
第二个框架元素尝试 https 连接,如果成功则重置看门狗框架,使其永远不会触发。如果失败(假设 https 证书验证失败),则监视消息将触发并呈现给用户。
根据您的浏览器,您很可能仍会使用该方法看到一些安全警告,但您至少可以推送您自己的内容,而无需用户在没有适当信任链的情况下运行不受信任的代码(这会比安全性更糟糕) POV 而不是接受证书验证错误并建立不受信任的 ssl 会话)
使用其他测试方法(例如 XMLHttpRequest 等)可能会改进该概念。
你不应该这样做。根证书不是您刚安装的东西,因为添加一个可能会损害 https 为您提供的任何安全性。
但是,如果您正在制作桌面应用程序,则只需收听 127.0.0.1。这样,流量永远不会离开用户的计算机,攻击者也无法监听。
您可能会尝试在每个用户会话中添加一些(隐藏的)Flex 元素或 Java Applet。它只会下载您服务器的任何 https 页面,并将获取有关连接的所有信息:
com.sun.deploy.security.CertificateHostnameVerifier.verify()
or
javax.security.cert.X509Certificate.checkValidity()
我想 Flex(这对用户来说更常见)应该有类似的方式来从用户的角度验证 https 证书。它还应该共享操作系统的受信任证书。存储,而 Java 可能有自己的。
由于服务器在客户端机器(桌面产品)上运行,它不能使用 winapi/os 功能检查支持的浏览器是否安装了证书?我知道 Firefox 在用户的配置文件目录中有一个证书数据库,而 IE 可能会将信息保存在注册表中。它对所有浏览器都不可靠,但如果服务器只是在“找到证书”和“请确保在继续之前安装了证书”之间进行选择,那么用户可以选择继续任何一种方式都不会造成任何伤害。
您还可以通过提供嵌入式浏览器(即 gecko)来简化问题,这样您只需使用 1 个浏览器即可处理很多事情(包括预安装根 CA)。
回顾一下:您正在桌面应用程序上设置网络服务器;每个桌面都有自己的网络服务器,但您想使用 SSL 来保护与该网络服务器的连接。
我猜这里的证书有几个问题,一个是用于访问桌面的主机名必须与证书匹配。在这种情况下,您别无选择,只能在客户端上生成证书。您需要允许用户以某种方式指定主机名,以防无法从主机本身检测到外人使用的名称。
对于那些不想依赖自签名证书的人,我还建议允许管理员安装受信任的证书。通过这种方式,您还可以将可信证书维护的成本转移给真正需要它的管理员。
最后,根据我的经验,浏览器要么允许要么拒绝自签名证书,服务器无法知道证书是被拒绝、暂时接受还是永久接受。我认为在某处必须有一种机制来处理 SSL 故障,但典型的 Web 编程不在该层运行。在任何情况下,如果 SSL 失败,Web 服务器唯一能做的就是回退到非 SSL,并且您在评论中指出您不能拥有任何非 SSL。我认为您应该尝试取消该限制;在这种情况下,非 SSL 起始页将非常有帮助:它可以测试(使用框架或图像或 JSON 或 AJAX)https 连接,它可以链接到有关如何设置证书的文档,或从何处下载证书的安装程序。
如果浏览器由于自签名证书而无法连接,并且您根本不允许使用纯 HTTP,您可以通过哪些其他方式与用户通信?没有其他渠道,您无法建立渠道,因为您没有任何沟通。
您在评论中提到编写用于安装证书的 win32 应用程序。您可以在安装应用程序本身时安装证书,但这对任何远程浏览器都没有帮助,并且本地浏览器不需要 SSL 来访问 localhost。
我们一直在开发一个与此问题相关的名为 Forge 的开源 JavaScript 项目。您有用户可以访问的网站吗?如果是这样,那么您可以通过您的网站使用用于跨域的 Flash + 用于 TLS 的 JavaScript 的组合来提供与这些桌面应用程序的安全连接。它将要求您在您的网站上实现一些 Web 服务来处理桌面应用程序证书的签名证书(或让您的桌面应用程序上传自签名证书,以便可以通过 JavaScript 访问它们)。我们在这里描述它是如何工作的:
http://blog.digitalbazaar.com/2010/07/20/javascript-tls-1/
设置网站的另一种方法是直接在桌面应用服务器上托管 JavaScript+Flash,但由于它允许 MiTM 攻击而不太安全。您可以让您的用户通过常规 http 访问您的桌面应用程序以下载 JS+Flash+SSL 证书,然后通过 JS 开始使用 TLS。如果您在 localhost 连接上,MiTM 攻击可能不会那么令人担忧——也许足以让您考虑这个选项。
ActiveX 控件可以解决问题。但我真的没有插手帮助解决方案,更多的是不同意你所做的是安全风险的立场。
需要明确的是,您需要一个安全的密码(希望是 AES 而不是 DES),并且已经在控制您的端点,只是无法完全排除可能捕获明文密码或其他敏感数据的混杂模式网络嗅探器.
SSL 是一个“安全套接字层”,根据定义,它不依赖于任何证书。
然而,所有有效的现代密码都要求它对隧道端点进行身份验证,这并不总是对每个应用程序都是必需的;在使用 Web 服务 API 管理节点的众多后端数据中心自动化例程中,我遇到了一个挫折,其中“用户”实际上是在 RESTful 命令协商之前需要加密密钥交换的进程。
就我而言,VLAN 是通过 ACL 保护的,所以我真的“可以”发送明文身份验证标头。但只是打字让我有点呕吐。
我敢肯定,我会因为打字而被激怒,但我已经身经百战,在我 IT 职业生涯的 10 到 15 年也会对你做出同样的评论。所以我很同情他们的担忧,如果他们对安全有足够的热情来激怒我,我会非常感激。他们最终会弄清楚的......
但我确实同意这样一个事实,即“培训”用户自行安装根 CA 是一个坏主意。另一方面,如果您使用自签名证书,则必须训练他们安装它。如果用户不知道如何确定 CA Cert 是否值得信赖,他们肯定无法从 CA Cert 确定自签名证书,因此任何一个过程都会产生相同的效果。
如果是我,我会自动化这个过程,而不是让它帮助最终用户,这样它就尽可能地对他们隐藏,就像一个适当的 PKI 对企业所做的那样。
说到这个,我只是想到了一个潜在的解决方案。使用 Microsoft PKI 模型。使用 Server 2012 R2,您可以通过“工作区”使用“设备控制”将受信任的密钥传递给甚至不是域成员的端点,并且客户端计算机可以订阅多个工作区,因此如果它们订阅,它们不会单独提交给您的。一旦他们这样做并进行了身份验证,AD 证书服务角色将推送所有必要的根 CA 证书,这些证书存在于活动目录或指定的 LDAP 服务器中。(如果您使用离线 CA 服务器)
另外,我意识到这个帖子已经有 7 年的历史了,但我确信它仍然被很多需要类似解决方案的人引用,并且觉得有义务分享不同的意见。(好吧,微软,我给你的插件的回扣在哪里?)
-收银员