在服务器端生成私钥(证书)是一个坏主意吗?

时间:2016-05-05 13:03:20

标签: c# windows security transfer private-key

我正在使用一些加密项目(使用C#)并且有一项任务,我正在考虑如何做得好。

我需要客户端为非对称加密生成私钥,但是由于我已经查看了一些库,所以它并不是那么简洁和干净。轻松的任务。

为什么?

为了在Windows中生成私钥,我有下一个可能性:

  • 使用makecert.exepvk2pfx.exe等生成它们......但这些工具 来自Windows SDK,似乎是他们与其他DLL链接, 所以如果客户端有一个干净的操作系统(没有安装任何库),我可以: 1)。在客户端的PC上安装Windows SDK 2)。复制makecert.exe和其他实用程序和 坚持项目发布(我认为,由于不同的Windows版本(从7到10)和32/64位架构,这是一个坏主意

  • 使用Bouncy Castle生成,不错的方式(我也可以使用编程语言而不是外部工具,这对我来说是一个优势),但C#版本没有很好地记录,并且有一些源代码中丑陋的地方

  • 使用OpenSSL,不喜欢它,因为有几个函数调用 库中的错误本身(使用多线程)

  • 使用PowerShell(也是一个选项,但我想会有 在旧版Windows上支持它的问题,如7)

由于这些事实,我想,如果我释放客户端生成私钥怎么办?这是个坏主意吗?我可以在服务器端生成它并且不保存私钥,只需通过TLS传输。

以这种方式存在哪些安全漏洞?考虑一下,使用TLS是 STRICT 选项。

2 个答案:

答案 0 :(得分:0)

这取决于您的申请。在服务器上生成私钥至少有几个问题。

  1. 客户必须相信您以后不会保存此密钥。你知道你不是,但客户不知道。根据应用情况,它可能是重要的区别。

  2. 即使您通过TLS发送密钥,在某些情况下仍然可以被中间的人拦截。例如,公司可能会在组织中的每台计算机上安装受信任的根证书,然后拦截并解密进入该组织的所有ssl流量。根据应用程序的类型,这可能会也可能不重要。

  3. 假设您编写针对大量受众的聊天应用程序,并希望加密用户之间的所有消息。然后,如果您将在服务器上生成密钥 - 没有人会(或至少应该)使用您的应用程序。首先,您可以将所有密钥转储到政府\无论如何(他们不能100%确定不会发生这种情况),即使您不会这样做 - 整个国家都会通过使用"来检查ssl流量。假"受信任的根证书。

    如此长的故事简短 - 如果您可以在客户端生成私钥 - 那就这样做。在你的情况下,我认为你可以。

答案 1 :(得分:0)

取决于多方面的考虑因素!

  • 您的用户期望什么?旨在提供“零知识”解决方案(例如SpiderOak)的设计保证即使对服务器具有完全管理员访问权限的人也可以解密您的数据。在这种情况下,在服务器上生成密钥并承诺不存储它不会削减它:任何对服务器具有完全管理员访问权限的人都可以随时破坏该承诺。因此,要实现真正的零知识,您必须在客户端生成密钥。
  • 您是否愿意接受性能影响?它是否打开DoS向量?也许是因为我是一个安全人员,我绝对不会在服务器上这样做。

如果我是你,我会在客户端追求BouncyCastle。