4

我正在编写一个客户端/服务器应用程序,该应用程序需要服务器能够对客户端进行身份验证,并且还需要对所有通信进行加密。

提供此功能的机制需要自包含在服务器和客户端应用程序中,并且还需要完全自动化(无需人工交互)。SSL 似乎是最好的方法,也是我熟悉的使用方法。

对于需要为其部署客户端软件的每个客户端,我计划(即时)创建一个 MSI 安装程序,其中包含应用程序、客户端证书(由服务器签名)和私钥以及服务器公共证书(以便客户端可以验证服务器 - 服务器证书可以是自签名的)。

我可以为客户端生成密钥并制作 CSR,但似乎无法找到实际签署 CSR 并为客户端生成证书的方法。我研究了 Win32 Crypto API,但没有找到任何关于如何实际签署 CSR 和获取客户端证书的示例。

我知道如何使用 openssl 工具从命令行执行所有这些操作,但不确定如何在应用程序中执行此操作。

请注意,对 openssl 工具进行系统调用并传入我知道可以工作的参数不是一种选择,因为依赖 openssl 工具不会以任何方式受到损害是一个巨大的安全风险。这样做不会满足自包含的要求。

我正在以正确的方式解决这个问题,或者有更好的方法来实现同样的事情 - 基本上是对连接到服务器的客户端的身份验证以及连接客户端对他们连接到的服务器进行身份验证的方式,所有这些都是加密的。

我不能对具有静态 IP 或主机名的服务器(或客户端)做出任何假设(DNS 无论如何都可能被破坏),我也不能对任何现有的 PKI 基础设施做出任何假设。

我主要在 C#.Net 中编写此代码,但如果它为我提供此功能,我会考虑为此编写 C++ 扩展。

最后,这是我在这里的第一篇文章,所以如果我遗漏了一些明显的东西或缺少任何细节,请询问,我会填补空白:)

谢谢,

詹姆士

4

2 回答 2

1

在 C# 中,您可以使用我们的 SecureBlackbox 产品的PKIBlackbox包,它提供了您在 .NET 中寻找的所有功能。也许 BouncyCastle 库也包含此功能。

于 2011-04-06T04:45:31.733 回答
1

您至少需要重新考虑其中的一部分。你正在做的事情是完全不安全的。客户端的私钥需要在客户端生成。否则它不是私有的,因此它不可能满足 PKI 的任何原则。包括您签发它的目的。你失去了独特性,你也失去了不可否认性。这两个都是致命的缺陷。

于 2011-04-06T08:30:26.390 回答