自签名证书 - 帮助用户知道他们需要将根CA添加到受信任的证书库

时间:2009-05-18 14:05:21

标签: javascript browser certificate ssl-certificate self-signed

我有一个桌面产品,它使用嵌入式网络服务器,它将使用自签名证书。

我是否可以将某些内容放入网页中,以检测到他们没有将根CA添加到其受信任列表中,并显示链接或DIV或指示他们如何操作的内容?

我想也许是有安装CA的说明的DIV,以及运行某些测试的Javascript(尝试访问没有内部警告的东西?),如果测试成功,则隐藏DIV。或类似的......

来自辉煌的SO社区的任何想法? :)

9 个答案:

答案 0 :(得分:10)

你为什么要这样做?训练用户不加选择地安装根CA证书是一个坏主意,因为网站告诉他们。你正在破坏整个信任链。有安全意识的用户会忽略您安装证书的建议,并且可能会认为您没有认真对待安全问题,因为您没有从现有CA获取证书。

你真的需要HTTPS吗?如果是这样,您应该咬紧牙关并与CA达成协议,以便为您的客户提供正确的CA签名服务器证书。如果Web服务器仅用于桌面应用程序的本地连接,则应将自签名证书作为安装过程的一部分添加到受信任列表,或者切换到HTTP。

答案 1 :(得分:2)

假设你知道C#而你想安装一个pfx文件。创建一个将从网址运行的exe。Follow this URL

答案 2 :(得分:2)

我唯一的想法就是使用框架和一些javascript。

在向用户显示自定义ssl失败消息之前,框架的第一个元素将充当监视器等待x个时间量(javascript setTimeout),并带有超链接或指令以下载自签名证书。

第二个帧元素尝试https连接,如果成功重置看门狗帧,则永远不会触发。如果失败(假设https证书验证失败),那么看门狗消息将被触发并呈现给用户。

根据您的浏览器,您很可能仍会看到该方法的一些安全警告,但您至少可以推送自己的内容,而无需用户运行不受信任的代码而没有适当的信任链(这会更糟糕来自安全POV,而不是接受证书验证错误并建立不受信任的ssl会话)

使用其他测试方法(如XMLHttpRequest等)可以改进概念。

答案 3 :(得分:2)

你不应该这样做。根证书不是您刚安装的,因为添加一个证书可能会损害https给您的任何安全性。

但是,如果您正在制作桌面应用程序,那么只需要收听127.0.0.1。这样,流量永远不会离开用户计算机,攻击者也无法收听。

答案 4 :(得分:0)

您可能会尝试在每个用户会话中添加一些(隐藏的)Flex元素或Java Applet。 它只会下载您服务器的任何https页面,并将获得有关连接的所有信息:

com.sun.deploy.security.CertificateHostnameVerifier.verify()
or
javax.security.cert.X509Certificate.checkValidity()

我认为Flex(用户更常见)应该有类似的方法从用户的角度验证https证书。它还应该共享操作系统的可信证书。存储,而Java可能有自己的。

答案 5 :(得分:0)

由于服务器在客户端计算机(桌面产品)上运行,是否可以使用winapi / os函数检查支持的浏览器是否安装了证书?我知道Firefox在用户的配置文件目录中有一个证书数据库,IE可能会在注册表中保存信息。它对所有浏览器都不可靠,但如果服务器只是在“找到证书”和“请确保在继续之前已经安装了证书”之间进行选择,那么不会造成任何伤害,因为用户可以选择继续任何一种方式。

您也可以通过提供嵌入式浏览器(即gecko)来简化问题,这样您只需要1个浏览器即可处理,这简化了很多事情(包括预安装根CA)。

答案 6 :(得分:0)

回顾一下:您正在桌面应用上设置网络服务器;每个桌面都有自己的网络服务器,但您希望使用SSL来保护与该网络服务器的连接。

我想这里有几个问题证书,一个是用于访问桌面的主机名必须与证书匹配。在这种情况下,您别无选择,只能在客户端上生成证书。如果无法从主机本身检测到外人使用的名称,则需要允许用户以某种方式指定主机名。

我还建议允许管理员为那些不想依赖自签名证书的人安装受信任的证书。这样,您还可以将可信证书维护的成本转移给真正想要它的管理员。

最后,根据我的经验,浏览器允许或拒绝自签名证书,服务器无法知道证书是否被拒绝,或被临时接受或永久接受。我假设必须有一个机制来处理SSL故障,但典型的Web编程不在该层运行。在任何情况下,如果SSL失败,网络服务器唯一可以做的就是回退到非SSL,并且您在评论中指出您不能拥有任何非SSL。我认为你应该试着解除这个限制;在这种情况下,非SSL启动页面非常有用:它可以测试(使用框架或图像或JSON或AJAX)https连接,它可以链接到有关如何设置证书或在何处下载证书的安装程序。

如果浏览器因为自签名证书而无法连接,并且您根本不允许使用普通HTTP,那么您可以通过其他方式与用户进行通信?没有其他渠道,你不能建立一个渠道,因为你没有任何沟通。

您在评论中提到了编写用于安装证书的win32应用程序。您可以在安装应用程序本身时安装证书,但这对任何远程浏览器都没有帮助,本地浏览器不需要SSL来访问localhost。

答案 7 :(得分:0)

我们一直在研究一个名为Forge的开源JavaScript项目,该项目与此问题有关。您是否拥有用户可以访问的网站?如果是这样,那么您可以通过您的网站使用Flash for Cross-domain + JavaScript for TLS提供与这些桌面应用程序的安全连接。它将要求您在您的网站上实施一些Web服务,以处理桌面应用程序证书的签名证书(或让您的桌面应用程序上载自签名证书,以便可以通过JavaScript访问它们)。我们在这里描述它是如何工作的:

http://blog.digitalbazaar.com/2010/07/20/javascript-tls-1/

设置网站的替代方案,但由于允许MiTM攻击而不太安全,因此可以直接在桌面应用服务器上托管JavaScript + Flash。您可以让您的用户通过常规http访问您的桌面应用程序以下载JS + Flash + SSL证书,然后通过JS开始使用TLS。如果您使用的是本地主机连接,则MiTM攻击可能不那么令人担忧 - 也许足以让您考虑这个选项。

答案 8 :(得分:0)

ActiveX控件可以解决这个问题。但我真的没有帮助解决这个问题,更多的是不同意你所做的是安全风险的立场。

要明确的是,您需要一个安全的密码(希望是AES而不是DES),并且已经控制了您的端点,只是无法完全排除可能捕获明文密码的混杂模式网络嗅探器或其他敏感数据。

SSL是“安全套接字层”,根据定义,它不依赖于任何证书。

但是,所有有效的现代密码都要求它对隧道端点进行身份验证,这对于每个应用程序来说并不总是必需的;我在许多后端数据中心自动化例程中使用Web服务API来管理节点时遇到的挫折,其中“用户”实际上是在RESTful命令协商之前需要加密密钥交换的进程。

就我而言,VLAN是通过ACL保护的,所以我真的“可以”发送明文身份验证头。但只是打字让我在嘴里呕吐了一下。

我确信我会因为输入此内容而受到抨击,但我非常顽强,并且在我的IT职业生涯的10到15年里会对你发表同样的评论。因此,我对他们的担忧表示同情,并非常感谢他们对安全的热情,以激励我。他们最终会弄明白.....

但我同意这样一个事实:“培训”用户自己安装root CA是一个不好的想法。另一方面,如果您使用自签名证书,则必须训练它们进行安装。如果用户不知道如何确定CA Cert是否值得信任,他们肯定无法从CA Cert确定自签名证书,因此任一流程都会产生相同的效果。

如果是我,我会自动化这个过程,而不是让它帮助最终用户,这样它就会变得尽可能地隐藏起来,就像正确的PKI会为企业做的那样。

说到这,我只想到了一个潜在的解决方案。使用Microsoft PKI模型。使用Server 2012 R2,您可以通过“工作区”使用“设备控制”向甚至不是域成员的端点提供可信密钥,并且客户端计算机可以订阅多个工作区,因此如果他们订阅,则不会仅向您自己提供。完成并进行身份验证后,AD证书服务角色将推送所有必需的根CA Certs,如活动目录或指定的LDAP服务器中所示。 (如果您使用的是脱机CA服务器)

此外,我意识到这个话题就像7岁,但我确信它仍然被很多需要类似解决方案的人所引用,并且觉得有义务分享一个对比鲜明的观点。 (好的,微软,我给你的插件的回扣是什么?)

-cashman

相关问题