在服务器端生成私钥(证书)是个坏主意吗?
Is it a bad idea to generate private keys (certs) at server side?
我正在做一些加密项目(使用 C#),有一个任务,我正在考虑如何做好。
我需要客户端为非对称加密生成私钥,但正如我查看了一些库,这并不是那么简单易行的任务。
为什么?
为了在 Windows 中生成私钥,我有以下可能性:
使用 makecert.exe
、pvk2pfx.exe
等生成它们...但是这些工具
来自 Windows SDK,并且似乎与其他 DLL 链接,
所以如果客户有一个干净的 OS (没有安装任何库)我可以:
1).在客户端 PC 上安装 Windows SDK 2)。复制 makecert.exe
和其他实用程序以及
将它与项目分发一起保存(我认为,由于不同的 Windows 版本(从 7 到 10)和 32/64 位架构
,这是一个坏主意
使用 Bouncy Castle
生成,不错的方法(我也可以使用编程语言而不是外部工具,这对我来说是一个优势),但是 C# 版本没有很好的记录而且源代码中有一些丑陋的地方
using OpenSSL
,不喜欢,因为有几个函数调用
库本身有错误(多线程)
using PowerShell
(也是一个选项,但我想会有
在 Windows 的旧版本上支持它的问题,如 7)
鉴于这些事实,我想,如果我让客户端不再生成私钥会怎么样?这是个坏主意吗?我可以在服务器端生成它,不要在上面保存私钥,只需通过 TLS 传输即可。
这种方式存在哪些安全漏洞?考虑一下,使用 TLS 是 STRICT 选项。
这取决于您的应用程序。在服务器上生成私钥至少存在几个问题。
客户必须相信您不会保存此密钥供以后使用。你知道你不知道,但客户不知道。根据应用程序,这可能是重要的区别。
即使您通过 TLS 发送密钥,在某些情况下它仍然可以被中间人截获。例如,公司可能会在组织中的每台计算机上安装受信任的根证书,然后拦截和解密所有流向 in\out 该组织的 ssl 流量。同样,这可能重要也可能不重要,具体取决于您的应用程序类型。
假设您编写面向大量受众的聊天应用程序,并希望对用户之间的所有消息进行加密。然后,如果您将在服务器上生成密钥 - 没有人会(或至少应该)使用您的应用程序。首先,您可以将他们所有的密钥转储到 government\whatever(他们不能 100% 确定这不会发生),即使您不会这样做 - 整个国家/地区都使用 [=26= 检查 ssl 流量] 受信任的根证书。
长话短说 - 如果您可以在客户端生成私钥 - 那就去做吧。在你的情况下,我认为你可以。
取决于多方面的考虑!
- 您的用户期望什么?旨在提供“零知识”解决方案(例如 SpiderOak)的设计保证即使是对服务器具有完全管理员访问权限的人也无法解密您的数据。在这种情况下,在服务器上生成密钥并承诺您不存储它并不能解决问题:任何对服务器具有完全管理员访问权限的人都可能随时违背该承诺。因此,要实现真正的零知识,您必须在客户端生成密钥。
- 您是否愿意接受性能影响?它会打开 DoS 向量吗?可能因为我是搞安全的,我是绝对不会在服务器上做的。
如果我是你,我会在客户端追求 BouncyCastle。
我正在做一些加密项目(使用 C#),有一个任务,我正在考虑如何做好。
我需要客户端为非对称加密生成私钥,但正如我查看了一些库,这并不是那么简单易行的任务。
为什么?
为了在 Windows 中生成私钥,我有以下可能性:
使用
makecert.exe
、pvk2pfx.exe
等生成它们...但是这些工具 来自 Windows SDK,并且似乎与其他 DLL 链接, 所以如果客户有一个干净的 OS (没有安装任何库)我可以: 1).在客户端 PC 上安装 Windows SDK 2)。复制makecert.exe
和其他实用程序以及 将它与项目分发一起保存(我认为,由于不同的 Windows 版本(从 7 到 10)和 32/64 位架构 ,这是一个坏主意
使用
Bouncy Castle
生成,不错的方法(我也可以使用编程语言而不是外部工具,这对我来说是一个优势),但是 C# 版本没有很好的记录而且源代码中有一些丑陋的地方using
OpenSSL
,不喜欢,因为有几个函数调用 库本身有错误(多线程)using
PowerShell
(也是一个选项,但我想会有 在 Windows 的旧版本上支持它的问题,如 7)
鉴于这些事实,我想,如果我让客户端不再生成私钥会怎么样?这是个坏主意吗?我可以在服务器端生成它,不要在上面保存私钥,只需通过 TLS 传输即可。
这种方式存在哪些安全漏洞?考虑一下,使用 TLS 是 STRICT 选项。
这取决于您的应用程序。在服务器上生成私钥至少存在几个问题。
客户必须相信您不会保存此密钥供以后使用。你知道你不知道,但客户不知道。根据应用程序,这可能是重要的区别。
即使您通过 TLS 发送密钥,在某些情况下它仍然可以被中间人截获。例如,公司可能会在组织中的每台计算机上安装受信任的根证书,然后拦截和解密所有流向 in\out 该组织的 ssl 流量。同样,这可能重要也可能不重要,具体取决于您的应用程序类型。
假设您编写面向大量受众的聊天应用程序,并希望对用户之间的所有消息进行加密。然后,如果您将在服务器上生成密钥 - 没有人会(或至少应该)使用您的应用程序。首先,您可以将他们所有的密钥转储到 government\whatever(他们不能 100% 确定这不会发生),即使您不会这样做 - 整个国家/地区都使用 [=26= 检查 ssl 流量] 受信任的根证书。
长话短说 - 如果您可以在客户端生成私钥 - 那就去做吧。在你的情况下,我认为你可以。
取决于多方面的考虑!
- 您的用户期望什么?旨在提供“零知识”解决方案(例如 SpiderOak)的设计保证即使是对服务器具有完全管理员访问权限的人也无法解密您的数据。在这种情况下,在服务器上生成密钥并承诺您不存储它并不能解决问题:任何对服务器具有完全管理员访问权限的人都可能随时违背该承诺。因此,要实现真正的零知识,您必须在客户端生成密钥。
- 您是否愿意接受性能影响?它会打开 DoS 向量吗?可能因为我是搞安全的,我是绝对不会在服务器上做的。
如果我是你,我会在客户端追求 BouncyCastle。